我在iOS上使用AVAssetWriter
来编码MP4视频。我目前正在使用AVAssetWriterInputPixelBufferAdaptor
传递数据,但我在这方面很灵活。
如何指定哪些输入帧是关键帧?
目前,我可以通过设置AVVideoMaxKeyFrameIntervalKey
来控制关键帧的数量(或使所有帧关键帧),但我的编码视频是一个简单的幻灯片 - 转换,我想确保主要图像上的关键帧而不牺牲压缩。
如果你制作CMSampleBufferRef
s(通过CMSampleBufferCreateReadyWithImageBuffer(…)
直接传递给你的AVAssetWriterInput
(而不是通过AVAssetWriterInputPixelBufferAdaptor
),你可以使用CMSetAttachment(…)
在你的帧上设置kCMSampleBufferAttachmentKey_ForceKeyFrame
到kCFBooleanTrue
,以确保它将成为一个关键帧。
远离AVAssetWriterInputPixelBufferAdaptor
的潜在缺点是你失去了拥有共享像素缓冲池所带来的内存效率。
如果内存效率很重要,您可能需要考虑查看VideoToolbox
和VTCompressionSession
。 VTCompressionSession
比AVAssetWriter*
更复杂,但也暴露了内部使用的像素缓冲池。
如果你确实沿着这条路线前进,那么在向kVTEncodeFrameOptionKey_ForceKeyFrame
提交帧以进行压缩时,你将需要使用kCFBooleanTrue
键设置为VTCompressionSessionEncodeFrame(…)
作为帧属性。