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