2016-09-24 7 views
1

ビデオファイルでCMTimeとfpsの機能を理解しようとしています。私はforループを使ってAVPlayerにビデオのすべてのフレームを表示しようとしています。私はこの作業がAVPlayerのplayメソッドを使って簡単にできることを知っています。しかし、フレームがどのくらい正確に表示されているかを知りたい。私はforループを作成し、AVPlayerのseekToTimeメソッドを常に更新することによって、各フレームを1つずつ表示しようとしました。私は解決策を開発することができますが、それはすべてのフレームを表示しておらず、ビデオはぎくしゃくして見えます。iOSで再生方法を使用せずにビデオフレームを表示する

これは私のコードです:

ここ
for(float t=0; t < asset.duration.value; t++) 
{ 
    CMTime tt = CMTimeMake(t, asset.duration.timescale); 
    [self.player seekToTime:tt]; 
    NSLog(@"%lld, %d",tt.value, tt.timescale); 
} 

、プレイヤーは、資産がそのフレーム私が提示しようとしているビデオ資産である、AVPlayerのインスタンスです。 CMTimeMakeSeconds(t、asset.duration.timescale)を使ってみましたが、動作しませんでした。

ご提案ください。 ありがとうございます。

答えて

0

フレームは一般にビデオファイルでは定数ではありません。フレームは、発生したときに発生します。あなたが知りたい場合は、それはあなたがAVAssetReaderAVAssetReaderTrackOutputクラスを使用してフレームプレゼンテーションタイムスタンプを調べることができたとき:あなたのコードで

let reader = try! AVAssetReader(asset: asset) 

let videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] 
let trackReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings:nil) 

reader.addOutput(trackReaderOutput) 
reader.startReading() 

while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() { 
    // pts shows when this frame is presented 
    // relative to the start of the video file 
    let pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) 
} 

は、あなたが間違ったビデオのタイムラインをサンプリングしています。ここでは、30 fpsで、それをサンプリングしまう方法です(前述したように、これはおそらく、実際のフレーム境界に対応していません):私はiOSの写真アプリ内の1つのようなスムーズなビデオスクラバーを作成しようとしています

for (CMTime t = kCMTimeZero; CMTimeCompare(t, asset.duration) < 0; t = CMTimeAdd(t, CMTimeMake(1, 30))) { 
    [player seekToTime:t]; 
} 
+0

。私はAVAssetReaderが私の仕事をすべきだと思います。あなたはAVAsstReaderについて読んでもいいところからいくつかのリソースを提案できますか?私が見つけることができる唯一のリソースは、ビデオをキャプチャする際に個々のフレームを処理することに関するアップルのウェブサイトです。私はカメラのロールから選択されたビデオのための個々のフレームを取得するために探しています。ありがとう。 – maven25

関連する問題