Lendo amostras via AVAssetReader

Como você lê amostras via AVAssetReader? Eu encontrei exemplos de duplicação ou mistura usando AVAssetReader, mas esses loops são sempre controlados pelo loop AVAssetWriter. É possível apenas criar um AVAssetReader e lê-lo, obtendo cada amostra?

Obrigado.

Não está claro se você está falando sobre amostras de vídeo ou amostras de áudio. Para ler amostras de vídeo, você precisa fazer o seguinte:

  1. Construa um AVAssetReader:

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

  2. Receba as faixas de vídeo do seu material:

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

  3. Defina o formato de quadro de vídeo desejado:

      Dicionário NSMutableDictionary * = [[NSMutableDictionary alloc] init];
     [dictionary setObject: [NSNumber numberWithInt: ] forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey]; 

    Note que certos formatos de vídeo simplesmente não funcionam, e se você está fazendo algo em tempo real, certos formatos de vídeo têm um desempenho melhor do que outros (a BGRA é mais rápida que o ARGB, por exemplo).

  4. Construa a saída da trilha real e adicione-a ao leitor de ativos:

      AVAssetReaderTrackOutput * asset_reader_output = [[Alocação de AVAssetReaderTrackOutput] initWithTrack: output de video_trackConfigurações: dictionary];
     [asset_reader addOutput: asset_reader_output]; 
  5. Kick off the asset reader:

    [asset_reader startReading];

  6. Leia as amostras:

     CMSampleBufferRef buffer;
     while ([asset_reader status] == AVAssetReaderStatusReading)
           buffer = [asset_reader_output copyNextSampleBuffer];
    

A resposta de damian funcionou para mim com o vídeo e uma pequena modificação: na etapa 3, acho que o dictionary precisa ser mutável:

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