2011-12-26 12 views
7

Estoy obteniendo frame buffer uno por uno del archivo de video usando AVAssetReader y haciendo alguna operación en el marco y luego guardando el nuevo cuadro en el archivo temporal usando AVAssetWritter. Ahora tengo la ruta del archivo temporal donde todo el nuevo cuadro está guardando uno a uno. ¿Hay alguna manera de reproducir video en los marcos de tiempo continuamente se está agregando al archivo temporal?Reproducir video usando AVPlayer

aquí es el código para ver el video de la trayectoria temporal (donde está continuamente añadiendo marcos)

- (void)loadAssetFromFile { 

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[(mMediaReader.mCameraRecorder) tempVideoFilePath ]] options:nil]; 
    NSString *tracksKey = @"tracks"; 

    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler: 
    ^{ 

     // Completion handler block. 
     dispatch_async(dispatch_get_main_queue(), 
         ^{ 
          NSError *error = nil; 
          AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error]; 

          if (status == AVKeyValueStatusLoaded) { 
           self.mPlayerItem = [AVPlayerItem playerItemWithAsset:asset]; 
           [mPlayerItem addObserver:self forKeyPath:@"status" 
               options:0 context:&ItemStatusContext]; 
           [[NSNotificationCenter defaultCenter] addObserver:self 
                     selector:@selector(playerItemDidReachEnd:) 
                      name:AVPlayerItemDidPlayToEndTimeNotification 
                      object:mPlayerItem]; 
           self.mPlayer = [AVPlayer playerWithPlayerItem:mPlayerItem]; 
           [mPlayerView setPlayer:mPlayer]; 
           [self play:nil]; 
          } 
          else { 
           // You should deal with the error appropriately. 
           NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]); 
          } 
         }); 
    }]; 
} 

- (IBAction)play:sender { 
    [mPlayer play]; 
} 

Y el código dentro del bloque nunca se ejecuta.

+0

buscando su sugerencia ?? – iOSPawan

+0

sigue buscando la solución para este – iOSPawan

+0

Parece que 'loadValuesAsynchronouslyForKeys: completionHandler:' es un método en 'AVMetaDataItem', no' AVURLAsset' o 'AVAsset'. ¿Puedes confirmar que el objeto 'NSURL' no es' nil'? – sho

Respuesta

4

Dividir el video en varios sub videos funcionó para mí.

Lo que hice en lugar de guardar el video completo en una ruta temporal. Dividí ese video en varios videos secundarios y luego reemplacé la propiedad AVPlayerItem de AVPlayer en consecuencia.

Así que ahora la funcionalidad funciona igual que la transmisión de video. :)

+0

suena como una muy buena solución – Magnus

1

También puede convertir el CMSampleBuffer que el AVAssetReader devuelve en un CGImage y luego un UIImage y mostrarlo en un UIImageView, para renderizar los fotogramas a medida que se extraen del archivo de video original.

Hay un código de ejemplo dentro del AVFoundation Programming Guide que muestra cómo hacer esta conversión.

Cuestiones relacionadas