我与AVFoundation工作捕捉和录制音频。 有一些问题我不太明白。
基本上,我想从AVCaptureSession捕获音频和使用AVWriter写它,但是我需要在CMSampleBuffer的时间戳我从AVCaptureSession得到一些移动。 我读CMSampleBuffer的文档,我看到的时间戳的两个不同的词:“提供时间标记”和“输出呈现时间戳”。 什么不同的两个?
让说,我得到一个CMSampleBuffer(音频)实例从AVCaptureSession,我想用AVWriter将其写入到一个文件,我应该用什么函数“注入”一CMTime到缓冲区,以便设置它的呈现时间戳生成的文件?
谢谢。
使用CMSampleBufferGetPresentationTimeStamp,即当缓冲器被捕获,并应“提交”,当回放是在同步的时候。 在WWDC 2012报价会话520:“演讲时间是在缓冲区中的第一个样品是由麦克风拾取的时间”。
如果你开始与AVWriter
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
然后追加与样品
if(videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer];
在完成的视频帧将与CMSampleBufferGetPresentationTimeStamp(我已签)是一致的。 如果要修改时添加样品时,你必须使用AVAssetWriterInputPixelBufferAdaptor
从这里的示例代码块: 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);