Reading samples via AVAssetReader

后端 未结 2 1549
余生分开走
余生分开走 2020-12-01 02:12

How do you read samples via AVAssetReader? I\'ve found examples of duplicating or mixing using AVAssetReader, but those loops are always controlled by the AVAssetWriter loop

相关标签:
2条回答
  • 2020-12-01 02:56

    damian's answer worked for me with video, and one minor modification: In step 3, I think the dictionary needs to be mutable:

    NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
    
    0 讨论(0)
  • 2020-12-01 03:13

    It's unclear from your question whether you are talking about video samples or audio samples. To read video samples, you need to do the following:

    1. Construct an AVAssetReader:

      asset_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; (error checking goes here)

    2. Get the video track(s) from your asset:

      NSArray* video_tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack* video_track = [video_tracks objectAtIndex:0];

    3. Set the desired video frame format:

      NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
      [dictionary setObject:[NSNumber numberWithInt:<format code from CVPixelBuffer.h>] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];

      Note that certain video formats just will not work, and if you're doing something real-time, certain video formats perform better than others (BGRA is faster than ARGB, for instance).

    4. Construct the actual track output and add it to the asset reader:

      AVAssetReaderTrackOutput* asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:video_track outputSettings:dictionary];
      [asset_reader addOutput:asset_reader_output];
    5. Kick off the asset reader:

      [asset_reader startReading];

    6. Read off the samples:

      CMSampleBufferRef buffer;
      while ( [asset_reader status]==AVAssetReaderStatusReading )
            buffer = [asset_reader_output copyNextSampleBuffer];
      
    0 讨论(0)
提交回复
热议问题