【问题标题】: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 的一个潜在缺点是您会失去共享像素缓冲池带来的内存效率。

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

    如果您确实走这条路,则在向VTCompressionSessionEncodeFrame(…) 提交帧以进行压缩时,您需要使用设置为kCFBooleanTruekVTEncodeFrameOptionKey_ForceKeyFrame 键作为帧属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多