如何为AVWriter写入设置CMSampleBuffer的时间戳
我正在使用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];
完成video中的帧将与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);
- 当按下lockingbutton时AVAudioRecorder停止
- CAShapeLayer上的CABasicAnimation不能用于path更改
- 从UIViewController调用UIViewController方法深深嵌套在一个模态中
- 通过Cordova config.xml添加条目到iOS .plist文件
- 特别分配和应用程序商店分布之间的区别是什么?
- 添加AVMutableVideoComposition的文本覆盖到特定的时间范围
- 在iOS中使用Xcode6的启动屏幕上的活动指示器
- 我需要知道如何获得关于哪个播放器正在stream式传输的信息(player,spotify,napster …)
- UIWebView嵌入式YouTubevideo播放中的状态栏问题