如何通过AVAssetReader读取样本?我找到了使用AVAssetReader复制或混合的示例,但这些循环始终由AVAssetWriter循环控制。是否可能只创建一个AVAssetReader并通过它进行阅读,获取每个样本?
谢谢。
如何通过AVAssetReader读取样本?我找到了使用AVAssetReader复制或混合的示例,但这些循环始终由AVAssetWriter循环控制。是否可能只创建一个AVAssetReader并通过它进行阅读,获取每个样本?
谢谢。
从您的问题中不清楚您是在谈论视频样本还是音频样本。要读取视频样本,您需要执行以下操作:
构建AVAssetReader:
asset_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
(这里进行错误检查)
从您的资源中获取视频轨道:
NSArray* video_tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack* video_track = [video_tracks objectAtIndex:0];
设置所需的视频帧格式:
NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init]; [dictionary 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 buffer; while ( [asset_reader status]==AVAssetReaderStatusReading ) buffer = [asset_reader_output copyNextSampleBuffer];
damian的回答对我有用,只需进行一点小修改即可:在第3步中,我认为需要将字典设置为可变的:
NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
@{(NSString*)kCVPixelBufferPixelFormatTypeKey : @(<CVPixelBuffer.h中的格式代码>)}
或经典的[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:<CVPixelBuffer.h中的格式代码>] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey]
即可,无需使其可变。在初始化时传递键/对象不需要可变性。 - Regexident