4

我正在使用AVFoundation來捕獲和錄製音頻。有一些問題我不太明白。如何爲AVWriter書寫設置CMSampleBuffer的時間戳

基本上我想從AVCaptureSession捕獲音頻並使用AVWriter編寫,但是我需要在從AVCaptureSession獲取的CMSampleBuffer的時間戳中進行一些轉換。我閱讀了CMSampleBuffer的文檔,我看到兩個不同的時間戳:'演示時間戳'和'輸出演示時間戳'。兩者有什麼不同?

假設我從AVCaptureSession獲得一個CMSampleBuffer(用於音頻)實例,並且我想用AVWriter將它寫入一個文件,我應該使用什麼函數將CMTime「注入」緩衝區以設置演示文稿它在生成的文件中的時間戳?

謝謝。

回答

6

使用CMSampleBufferGetPresentationTimeStamp,這是捕獲緩衝區的時間,應在播放時同步播放時呈現。在WWDC 2012上引用會話520:「演示時間是緩衝區中的第一個樣本被麥克風拾取的時間」。

如果啓動AVWriter與

[videoWriter startWriting]; 
[videoWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)]; 

然後追加樣品

if(videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer]; 

在完成視頻幀將與CMSampleBufferGetPresentationTimeStamp是一致的(我已籤)。如果要修改時添加樣品時,你必須使用AVAssetWriterInputPixelBufferAdaptor

+0

爲什麼當你對答案不感興趣時​​,你會問一個問題? – Sten 2013-02-14 11:17:17

+0

我需要設置CMSampleBuffer的時間戳,因爲我想暫時記錄會話。我結束了使用CMSampleBufferCreateCopyWithNewTiming。我想知道是否有直接的方法來注入現有緩衝區的時間戳,所以我不需要複製它。 – 2013-02-17 10:52:07

+2

我無法使用AVAssetWriterInputPixelBufferAdaptor,因爲它只適用於視頻流。 – 2013-02-17 14:14:18

6

塊的示例代碼從這裏:http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html CMSampleBufferRef樣品 - 是您sampleBuffer,CMSampleBufferRef SOUT你的輸出。 NewTimeStamp是你的時間戳。

CMItemCount count; 
CMTime newTimeStamp = CMTimeMake(YOURTIME_GOES_HERE); 
CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count); 
CMSampleTimingInfo* pInfo = malloc(sizeof(CMSampleTimingInfo) * count); 
CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count); 
for (CMItemCount i = 0; i < count; i++) 
{ 
    pInfo[i].decodeTimeStamp = newTimeStamp; // kCMTimeInvalid if in sequence 
    pInfo[i].presentationTimeStamp = newTimeStamp; 

} 
CMSampleBufferRef sout; 
CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, sample, count, pInfo, &sout); 
free(pInfo); 
相關問題