2016-09-24 118 views
1

我想了解視頻文件中CMTime和fps的功能。我試圖使用for循環在AVPlayer中呈現視頻的每一幀。我知道這個任務可以使用AVPlayer的播放方法輕鬆完成。但我想知道如何顯示幀。我創建了一個for循環並試圖通過不斷更新AVPlayer的seekToTime方法逐個呈現每一幀。我能夠開發一個解決方案,但它沒有顯示所有的框架和視頻看起來生澀。在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的樣本時(如上面提到的,這可能不符合實際的幀邊界):

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

我想創建一個流暢的視頻洗滌器像在iOS版相冊應用。我認爲AVAssetReader應該做我的工作。你能否從我可以從哪裏開始閱讀有關AVAsstReader的建議,提供一些資源?我能找到的唯一資源是蘋果公司網站上關於捕捉視頻時處理個別幀的信息。我正在尋找從相機膠捲中選擇的視頻獲取單個幀。謝謝。 – maven25

相關問題