如何设置AVWriter写作CMSampleBuffer的时间戳(How to set timest

2019-08-16 20:36发布

我与AVFoundation工作捕捉和录制音频。 有一些问题我不太明白。

基本上,我想从AVCaptureSession捕获音频和使用AVWriter写它,但是我需要在CMSampleBuffer的时间戳我从AVCaptureSession得到一些移动。 我读CMSampleBuffer的文档,我看到的时间戳的两个不同的词:“提供时间标记”和“输出呈现时间戳”。 什么不同的两个?

让说,我得到一个CMSampleBuffer(音频)实例从AVCaptureSession,我想用AVWriter将其写入到一个文件,我应该用什么函数“注入”一CMTime到缓冲区,以便设置它的呈现时间戳生成的文件?

谢谢。

Answer 1:

使用CMSampleBufferGetPresentationTimeStamp,即当缓冲器被捕获,并应“提交”,当回放是在同步的时候。 在WWDC 2012报价会话520:“演讲时间是在缓冲区中的第一个样品是由麦克风拾取的时间”。

如果你开始与AVWriter

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

然后追加与样品

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

在完成的视频帧将与CMSampleBufferGetPresentationTimeStamp(我已签)是一致的。 如果要修改时添加样品时,你必须使用AVAssetWriterInputPixelBufferAdaptor



Answer 2:

从这里的示例代码块: 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);


文章来源: How to set timestamp of CMSampleBuffer for AVWriter writing