2011-08-09 11 views
6

Estoy tratando de grabar y reproducir video simultáneamente. ¿Es esto posible con avfoundation? Actualmente puedo hacerlo siempre que no grabe audio. Tan pronto como agregue la entrada de audio a AVCaptureSession y reinicie todo, recibo "AVCaptureSessionWasInterruptedNotification" y la grabación se detiene.Avfoundation - Reproducir y grabar video (junto con audio y vista previa) simultáneamente

Así es como reproduzco el video.

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]  initWithContentURL:[NSURL fileURLWithPath:path]]; 
[moviePlayer.view setFrame:self.playerView.bounds]; 
moviePlayer.useApplicationAudioSession=NO; 
self.player = moviePlayer; 

[moviePlayer release]; 

[self.playerView addSubview:player.view]; 

[player play]; 

Y así es como grabar vídeo:

NSError *error; 

AVCamCaptureManager *captureManager = [[AVCamCaptureManager alloc] init]; 



if ([captureManager setupSessionWithPreset:AVCaptureSessionPresetLow error:&error]) 
{ 
    [self setCaptureManager:captureManager]; 



    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[captureManager session]]; 
    self.captureVideoPreviewLayer= previewLayer; 

    UIView *view = [self cameraView]; 
    CALayer *viewLayer = [view layer]; 
    [viewLayer setMasksToBounds:YES]; 

    CGRect bounds = [view bounds]; 


    [captureVideoPreviewLayer setFrame:bounds]; 

    if ([captureVideoPreviewLayer isOrientationSupported]) 
    [captureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait]; 


    [captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 


    [[captureManager session] startRunning]; 

    [self setCaptureVideoPreviewLayer:captureVideoPreviewLayer]; 

    if ([[captureManager session] isRunning]) 
    { 
     [captureManager setOrientation:AVCaptureVideoOrientationPortrait]; 
     [captureManager setDelegate:self]; 


     [viewLayer insertSublayer:captureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]]; 

     NSString *countString = [[NSString alloc] initWithFormat:@"%d", [[AVCaptureDevice devices] count]]; 
     NSLog(@"Device count: %@",countString); 


    } else { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Failure" 
                  message:@"Failed to start session." 
                  delegate:nil 
                cancelButtonTitle:@"Okay" 
                otherButtonTitles:nil]; 
     [alertView show]; 
     [alertView release]; 

    } 
} else { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Input Device Init Failed" 
                 message:[error localizedDescription] 
                 delegate:nil 
               cancelButtonTitle:@"Okay" 
               otherButtonTitles:nil]; 
    [alertView show]; 
    [alertView release];   
} 

[captureManager release]; 
if (![[self captureManager] isRecording]) { 
    [[self captureManager] startRecording]; 
} 

Cuando, como estoy usando "AVCamCaptureManager" de código de ejemplo AVCam manzana.

Respuesta

4

En primer lugar, establecer el MoviePlayer utilizar la sesión de audio aplicación:

moviePlayer.useApplicationAudioSession=YES; 

Entonces, antes llamando [[sesión de CaptureManager] startRunning], activar una sesión de audio con su categoría establecida en "PLAY y grabar "y anular su propiedad para permitir que se mezcle con otros.

// Set audio session category to "play and record" 
NSError* error = nil; 
AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 
if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]) { 
    NSLog(@"AVAudioSession setCategory failed: %@", [error localizedDescription]); 
} 

// Set audio session property "allow mixing" to true so audio can be recorded while it is playing 
UInt32 allowMixing = true; 
OSStatus status = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 
if (status != kAudioSessionNoError) { 
    NSLog(@"AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers) failed: %ld", status); 
} 

// Activate the audio session 
error = nil; 
if (![audioSession setActive:YES error:&error]) { 
    NSLog(@"AVAudioSession setActive:YES failed: %@", [error localizedDescription]); 
} 
+0

Esto es interesante, ya que contradice la respuesta aceptada aquí: http://stackoverflow.com/a/10559420/954643 que dice iniciar la sesión de audio después de la sesión de captura. – qix

+0

En realidad, los documentos dicen esto sobre 'useApplicationAudioSession':" Un valor booleano que indica si el reproductor de películas debería usar la sesión de audio de la aplicación. (Obsoleto en iOS 6.0. No hay reemplazo para esta propiedad y se desaconseja su uso). El valor predeterminado es 'YES' ya. – qix

0

Sólo si alguien se pregunta ... Tengo el enfoque anterior al trabajo, así que Wertesse propuso, pero también funciona con un AVPlayer (que no tiene el atributo useApplicationAudioSession).

+0

Hola Bernt, ¿hay alguna información adicional sobre cómo hacer que esto funcione? Dupliqué efectivamente el código en la pregunta original en mi función viewDidLoad y agregué la configuración de AudioSession. Sin embargo, mi CaptureSession todavía se está deteniendo. La muestra de código sería muy apreciada. ¡Gracias! – kungfoo

Cuestiones relacionadas