Чтение образцов через AVAssetReader - PullRequest
10 голосов
/ 29 октября 2010

Как вы читаете образцы через AVAssetReader?Я нашел примеры дублирования или микширования с использованием AVAssetReader, но эти циклы всегда контролируются циклом AVAssetWriter.Можно ли просто создать AVAssetReader и прочитать его, получая каждый образец?

Спасибо.

Ответы [ 2 ]

25 голосов
/ 18 ноября 2010

Из вашего вопроса неясно, говорите ли вы о сэмплах видео или аудио. Чтобы прочитать образцы видео, вам необходимо сделать следующее:

  1. Создание AVAssetReader:

    asset_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; (error checking goes here)

  2. Получить видео (треки) из вашего ресурса:

    NSArray* video_tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack* video_track = [video_tracks objectAtIndex:0];

  3. Установите желаемый формат видеокадра:

    NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setObject:[NSNumber numberWithInt:<format code from CVPixelBuffer.h>] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];

    Обратите внимание, что некоторые форматы видео просто не будут работать, и если вы делаете что-то в режиме реального времени, некоторые форматы видео работают лучше, чем другие (например, BGRA быстрее, чем ARGB).

  4. Создайте фактический выходной трек и добавьте его в считыватель ресурсов:

    AVAssetReaderTrackOutput* asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:video_track outputSettings:dictionary];
    [asset_reader addOutput:asset_reader_output];
  5. Начните чтение ресурса:

    [asset_reader startReading];

  6. Считать образцы:

    CMSampleBufferRef buffer;
    while ( [asset_reader status]==AVAssetReaderStatusReading )
          buffer = [asset_reader_output copyNextSampleBuffer];
    
2 голосов
/ 18 мая 2011

Ответ Дэмиана работал для меня с видео и одной незначительной модификацией: на шаге 3, я думаю, словарь должен быть изменяемым:

NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
...