2010-10-29 11 views
10

Come si leggono i campioni tramite AVAssetReader? Ho trovato esempi di duplicazione o mixaggio usando AVAssetReader, ma questi loop sono sempre controllati dal ciclo AVAssetWriter. È possibile solo creare un AVAssetReader e leggerlo attraverso, ottenendo ogni campione?Lettura di campioni tramite AVAssetReader

Grazie.

risposta

24

Non è chiaro dalla tua domanda se stai parlando di campioni video o campioni audio. Per leggere i campioni di video, è necessario effettuare le seguenti operazioni:

  1. costruire un AVAssetReader:

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

  2. Ottenere la traccia video (s) dal vostro bene:

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

  3. Impostare il formato di fotogramma video desiderato:

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

    Nota che alcuni formati video non funzionano e se stai facendo qualcosa in tempo reale, alcuni formati video hanno prestazioni migliori di altri (BGRA è più veloce di ARGB, ad esempio).

  4. Costruire l'uscita effettiva pista e aggiungerlo al lettore risorsa:

    AVAssetReaderTrackOutput* asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:video_track outputSettings:dictionary]; 
    [asset_reader addOutput:asset_reader_output];
  5. Kick off il lettore risorsa:

    [asset_reader startReading];

  6. Leggere i campioni:

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

Grazie Damiano. In realtà stavo chiedendo di audio. Posso ottenere l'audio nel buffer, ma non so come ottenere i campioni all'interno del buffer. –

+0

Ho una lettura di campioni video funzionante, ma finisco con fotogrammi video vuoti ogni tanto (o sempre, per alcuni video). Nessun errore, solo cornici vuote. Qualche idea? –

+0

Non sono sicuro, mi dispiace. Forse controllare il timestamp della presentazione sui campioni? Riesci a trovare un modo per creare video sempre vuoti, forse questo ti aiuterà? – damian

2

di Damian ha funzionato per me con il video, ed una piccola modifica: Al punto 3, penso che il dizionario deve essere mutabile:

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

aah, giusto sei. l'ho risolto ora – damian

+2

Non è necessario renderlo mutabile. Basta usare i moderni Objective-C: '@ {(NSString *) kCVPixelBufferPixelFormatTypeKey: @ ()}' o il classico '[dizionario NSDictionaryWithObject: [NSNumero numeroWithInt: ] forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey] '. Passare la chiave/oggetto all'inizializzazione non richiede mutevolezza. – Regexident

+0

Grazie per questo chiarimento Regexidnet. –

Problemi correlati