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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 17 июля 2019

Как и вы, я ожидал, что установка 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

...