通过AVAssetReader读取样本

时间:2010-10-29 05:23:04

标签: objective-c iphone cocoa-touch avfoundation avassetreader

如何通过AVAssetReader读取样本?我找到了使用AVAssetReader进行复制或混合的示例,但这些循环始终由AVAssetWriter循环控制。是否可以创建AVAssetReader并读取它,获取每个样本?

感谢。

2 个答案:

答案 0 :(得分:25)

您的问题不清楚您是在谈论视频样本还是音频样本。要阅读视频样本,您需要执行以下操作:

  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];
    

答案 1 :(得分:2)

达米安的回答对我来说是视频和一个小修改:在第3步中,我认为字典需要是可变的:

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