AVAssetWriter:指定关键帧

时间:2014-05-29 15:10:42

标签: ios avfoundation mp4 avassetwriter

我在iOS上使用AVAssetWriter来编码MP4视频。我目前正在使用AVAssetWriterInputPixelBufferAdaptor传递数据,但我在此方面非常灵活。

如何指定哪些输入帧是关键帧?

目前,我可以通过设置AVVideoMaxKeyFrameIntervalKey来控制关键帧的数量(或使所有帧关键帧),但我的编码视频是一个简单的幻灯片 - 转换,我想确保主图像上的关键帧而不牺牲压缩。

1 个答案:

答案 0 :(得分:0)

如果您CMSampleBufferRef(通过CMSampleBufferCreateReadyWithImageBuffer(…)直接传递到AVAssetWriterInput(而不是通过AVAssetWriterInputPixelBufferAdaptor),则可以使用{{1}在您的框架上将CMSetAttachment(…)设置为kCMSampleBufferAttachmentKey_ForceKeyFrame,以确保它将成为关键帧。

远离kCFBooleanTrue的潜在缺点是你失去了拥有共享像素缓冲池所带来的内存效率。

如果内存效率很重要,您可能需要考虑转而使用AVAssetWriterInputPixelBufferAdaptorVideoToolboxVTCompressionSessionVTCompressionSession更复杂,但也暴露了内部使用的像素缓冲池。

如果确实沿着这条路线前进,那么在向AVAssetWriter*提交框架进行压缩时,您需要使用kVTEncodeFrameOptionKey_ForceKeyFrame设置为kCFBooleanTrue的密钥作为框架属性。