13

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

谢谢。

4

2 回答 2

27

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

  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* 字典 = [[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 )
          缓冲区 = [asset_reader_output copyNextSampleBuffer];
    
于 2010-11-18T15:03:16.110 回答
2

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

NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
于 2011-05-18T11:10:45.483 回答