AVAssetWriter: указать ключевые кадры

Я использую AVAssetWriter на iOS для кодирования видео MP4. В настоящее время я передаю данные с помощью AVAssetWriterInputPixelBufferAdaptor, но я проявляю гибкость в этом отношении.

Как я могу указать, какие из моих входных кадров являются ключевыми кадрами?

В настоящее время я могу контролировать количество ключевых кадров (или сделать все кадры ключевыми), установив AVVideoMaxKeyFrameIntervalKey, но мое закодированное видео представляет собой простое слайд-шоу с переходами, и я хотел бы обеспечить ключевые кадры на основных изображениях, не жертвуя сжатие.


person Michael Brewer-Davis    schedule 29.05.2014    source источник


Ответы (1)


Если вы делаете CMSampleBufferRefs (через CMSampleBufferCreateReadyWithImageBuffer(…) для прямого перехода к вашему AVAssetWriterInput (вместо прохождения через AVAssetWriterInputPixelBufferAdaptor), вы можете затем использовать CMSetAttachment(…), чтобы установить kCMSampleBufferAttachmentKey_ForceKeyFrame в kCFBooleanTrue на вашем кадре, чтобы гарантировать, что он станет ключевым кадром.

Потенциальным недостатком отказа от AVAssetWriterInputPixelBufferAdaptor является то, что вы теряете эффективность использования памяти, связанную с наличием общего пула буферов пикселей.

Если эффективность памяти важна, вы можете вместо этого рассмотреть VideoToolbox и VTCompressionSession. VTCompressionSession сложнее, чем AVAssetWriter*, но также предоставляет доступ к пулу буферов пикселей, который используется внутри.

Если вы пойдете по этому пути, вам нужно будет использовать ключ kVTEncodeFrameOptionKey_ForceKeyFrame, установленный на kCFBooleanTrue, в качестве атрибута кадра при отправке кадра на VTCompressionSessionEncodeFrame(…) для сжатия.

person zadr    schedule 30.12.2017