繁体   English   中英

如何为AVWriter写入设置CMSampleBuffer的时间戳

[英]How to set timestamp of CMSampleBuffer for AVWriter writing

我正在使用AVFoundation捕获和录制音频。 有些问题我不太明白。

基本上我想从AVCaptureSession捕获音频并使用AVWriter编写它,但是我需要在从AVCaptureSession获得的CMSampleBuffer的时间戳中进行一些转换。 我阅读了CMSampleBuffer的文档。我看到两个不同的时间戳术语:'presentation timestamp'和'output presentation timestamp'。 这两者有什么不同?

假设我从AVCaptureSession获取CMSampleBuffer(用于音频)实例,并且我想使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM