Чтение сэмплов через AVAssetReader
Как вы читаете образцы через AVAssetReader? Я нашел примеры дублирования или микширования с использованием AVAssetReader, но эти циклы всегда контролируются циклом AVAssetWriter. Можно ли просто создать AVAssetReader и прочитать его, получая каждый образец?
Благодарю.
2 ответа
Из вашего вопроса неясно, говорите ли вы о сэмплах видео или аудио. Чтобы прочитать образцы видео, вам необходимо сделать следующее:
Создайте AVAssetReader:
asset_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; (error checking goes here)
Получить видео трек (ы) из вашего ресурса:
NSArray* video_tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack* video_track = [video_tracks objectAtIndex:0];
Установите желаемый формат видеокадра:
NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init]; [словарь setObject: [NSNumber numberWithInt:<код формата из CVPixelBuffer.h>] forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey];
Обратите внимание, что некоторые форматы видео просто не будут работать, и если вы делаете что-то в режиме реального времени, некоторые форматы видео работают лучше, чем другие (например, BGRA быстрее, чем ARGB).
Создайте фактический выходной трек и добавьте его в ридер ресурсов:
AVAssetReaderTrackOutput * asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack: video_track outputSettings: dictionary]; [asset_reader addOutput: asset_reader_output];
Начните чтение актива:
[asset_reader startReading];
Считайте образцы:
Буфер CMSampleBufferRef; while ( [asset_reader status]==AVAssetReaderStatusReading) buffer = [asset_reader_output copyNextSampleBuffer];
Ответ Дамиана сработал для меня с видео и одной незначительной модификацией: на шаге 3, я думаю, словарь должен быть изменяемым:
NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];