【问题标题】:AVAssetWriter: specify key framesAVAssetWriter:指定关键帧
【发布时间】:2017-12-30 17:55:48
【问题描述】:
我在 iOS 上使用 AVAssetWriter 来编码 MP4 视频。我目前正在使用AVAssetWriterInputPixelBufferAdaptor 传递数据,但我在这方面很灵活。
如何指定哪些输入帧是关键帧?
目前,我可以通过设置AVVideoMaxKeyFrameIntervalKey 来控制关键帧的数量(或使所有帧都成为关键帧),但我的编码视频是一个简单的带过渡的幻灯片,我想确保关键帧在主要图像而不牺牲压缩。
【问题讨论】:
标签:
ios
avfoundation
mp4
avassetwriter
【解决方案1】:
如果您使CMSampleBufferRefs(通过CMSampleBufferCreateReadyWithImageBuffer(…) 直接传递给您的AVAssetWriterInput(而不是通过AVAssetWriterInputPixelBufferAdaptor),则可以使用CMSetAttachment(…) 将kCMSampleBufferAttachmentKey_ForceKeyFrame 设置为@987654327 @ 在你的帧上,以确保它将成为关键帧。
远离AVAssetWriterInputPixelBufferAdaptor 的一个潜在缺点是您会失去共享像素缓冲池带来的内存效率。
如果内存效率很重要,您可能需要考虑查看VideoToolbox 和VTCompressionSession。 VTCompressionSession 比 AVAssetWriter* 更复杂,但也暴露了内部使用的像素缓冲池。
如果您确实走这条路,则在向VTCompressionSessionEncodeFrame(…) 提交帧以进行压缩时,您需要使用设置为kCFBooleanTrue 的kVTEncodeFrameOptionKey_ForceKeyFrame 键作为帧属性。