Как получить буферы изображений в их оригинальном формате из видеопотока с помощью AVFoundation?

В документации Apple для AVAssetReaderTrackOutput, это указывает на следующее о параметре для outputSettings при создании экземпляра с использованием +[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]

Значение nil конфигурирует выходные данные для продажи сэмплов в их исходном формате, как они сохраняются указанной дорожкой.

При использовании его, например, на видеоактиве MP4, он, по-видимому, будет перебирать кадры в порядке декодирования (то есть не в порядке относительно отображения), однако все запросы доставляются CMSampleBufferRef объекты, использующие CMSampleBufferGetImageBuffer доходность NULLCVImageBufferRef объекты.

Единственный способ обеспечить доставку объектов буфера изображения - это предоставить формат пиксельного буфера для outputSettings:, такие как kCVPixelFormatType_32ARGB для kCVPixelBufferPixelFormatTypeKey словарь.

Другим интересным побочным эффектом этого является то, что кадры затем доставляются в порядке отображения, а базовый порядок декодирования кадров абстрагируется / скрывается.

Есть идеи, почему это так?

0 ответов

Как и вы, я ожидал, что outputSettings из nil приведет к выводу видеокадров в собственном формате, но это не так, вы должны указать что-то, чтобы получить действительный CVSampleBufferRef.

Еще не все потеряно, использование словаря "еле-еле" позволяет выводить кадры в их собственном формате,

AVAsset asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
AVAssetTrack *videoTrack = [[asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual] objectAtIndex:0];

NSDictionary *decompressionSettings =
     @{ (id)kCVPixelBufferIOSurfacePropertiesKey : [NSDictionary dictionary] };
AVAssetReaderTrackOutput trackOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:decompressionSettings];
...

IOSurfaceOptions просто по умолчанию - дальнейшее чтение для справки: https://developer.apple.com/documentation/corevideo/kcvpixelbufferiosurfacepropertieskey?language=objc

Другие вопросы по тегам