Чтение сэмплов через AVAssetReader

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

Благодарю.

2 ответа

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

  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];
    [словарь setObject: [NSNumber numberWithInt:<код формата из 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;
    while ( [asset_reader status]==AVAssetReaderStatusReading)
          buffer = [asset_reader_output copyNextSampleBuffer];

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

NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
Другие вопросы по тегам