Как получить буферы изображений в их оригинальном формате из видеопотока с помощью AVFoundation?
В документации Apple для AVAssetReaderTrackOutput
, это указывает на следующее о параметре для outputSettings
при создании экземпляра с использованием +[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]
Значение nil конфигурирует выходные данные для продажи сэмплов в их исходном формате, как они сохраняются указанной дорожкой.
При использовании его, например, на видеоактиве MP4, он, по-видимому, будет перебирать кадры в порядке декодирования (то есть не в порядке относительно отображения), однако все запросы доставляются CMSampleBufferRef
объекты, использующие CMSampleBufferGetImageBuffer
доходность NULL
CVImageBufferRef
объекты.
Единственный способ обеспечить доставку объектов буфера изображения - это предоставить формат пиксельного буфера для 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