繁体   English   中英

通过AVAssetReader读取样本

[英]Reading samples via AVAssetReader

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

谢谢。

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

  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];\n [字典setObject:[NSNumber numberWithInt:<来自CVPixelBuffer.h的格式代码>] forKey:(NSString *)kCVPixelBufferPixelFormatTypeKey]; 

    请注意,某些视频格式无法正常工作,如果您正在进行实时操作,某些视频格式的效果会优于其他视频格式(例如,BGRA比ARGB更快)。

  4. 构造实际轨道输出并将其添加到资产阅读器:

      AVAssetReaderTrackOutput * asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:video_track outputSettings:dictionary];\n [asset_reader addOutput:asset_reader_output]; 
  5. 启动资产读者:

    [asset_reader startReading];

  6. 读取样本:

    \n CMSampleBufferRef缓冲区;\n while([asset_reader status] == AVAssetReaderStatusReading)\n       buffer = [asset_reader_output copyNextSampleBuffer];\n

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM