2012-06-05 18 views
9

Puedo grabar video y enviar la película a un archivo correctamente. Sin embargo, tengo un problema con la grabación de video (sin salida de video) cuando intento usar AVAudioPlayer para reproducir algo de audio. ¿Significa que no puedo usar AVCaptureSession y AVAudioPlayer al mismo tiempo? Aquí está mi código para crear la sesión de captura y reproducir el audio. La captura de video se inicia primero, luego, durante la captura, quiero reproducir algo de audio. Muchas gracias por cualquier ayuda.Uso de AVCaptureSession y AVAudioPlayer juntos

Código para crear la sesión de captura para grabar vídeo (con audio) - salida a un archivo .mov:

- (void)addVideoInput 
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
    //... also some code for setting up videoDevice/frontCamera 
    NSError *error; 
    AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput 
    deviceInputWithDevice:frontCamera error:&error]; 
    AVCaptureDeviceInput *audioIn = [AVCaptureDeviceInput 
    deviceInputWithDevice:audioDevice error:&error]; 
    if (!error) { 
     if ([captureSession canAddInput:audioIn]) 
       [captureSession addInput:audioIn]; 
     else 
       NSLog(@"Couldn't add audio input."); 
     if ([captureSession canAddInput:videoIn]) 
       [captureSession addInput:videoIn]; 
     else 
       NSLog(@"Couldn't add video input."); 
} 
- (void)addVideoOutput 
{ 
    AVCaptureMovieFileOutput *m_captureFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
    [captureSession addOutput:m_captureFileOutput]; 

    [captureSession startRunning]; 

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSMutableString *filePath = [NSMutableString stringWithString:@"Movie.mov"]; 
    NSString* fileRoot = [docDir stringByAppendingPathComponent:filePath]; 
    NSURL *fileURL = [NSURL fileURLWithPath:fileRoot]; 

    AVCaptureConnection *videoConnection = NULL; 

    for (AVCaptureConnection *connection in [m_captureFileOutput connections]) 
    { 
     for (AVCaptureInputPort *port in [connection inputPorts]) 
     { 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]) 
      { 
       videoConnection = connection; 

      } 
     } 
    } 

    [videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; 


    [m_captureFileOutput startRecordingToOutputFileURL:fileURL recordingDelegate:self]; 
    [m_captureFileOutput release]; 
} 

Código para reproducir el audio, esta función es llamada durante la sesión de captura de vídeo. Si no llamo a esta función, el video se graba y puedo guardarlo en el archivo .mov. Sin embargo, si llamo a esta función, no hay ningún archivo .mov de salida.

- (void)playAudio 
{ 
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"AudioFile" ofType:@"mp3"]; 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath]; 
    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
    [fileURL release]; 
    self.audioPlayer = newPlayer; 
    [newPlayer release]; 
    [audioPlayer setDelegate:self]; 
    [audioPlayer prepareToPlay]; 
    [audioPlayer play]; 
} 

Respuesta

19

He resuelto el problema configurando la sesión de audio. Llamé a la siguiente función antes de crear el objeto del reproductor de audio para reproducir el audio. De esa forma, pude grabar video (con audio) y reproducir audio al mismo tiempo.

- (void)setupAudioSession { 

     static BOOL audioSessionSetup = NO; 
     if (audioSessionSetup) { 
       return; 
     } 
     [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil]; 
     UInt32 doSetProperty = 1; 

     AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 

     [[AVAudioSession sharedInstance] setActive: YES error: nil]; 

     audioSessionSetup = YES; 

} 


- (void)playAudio 
{ 
     [self setupAudioSession]; 
     NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"AudioFile" ofType:@"mp3"]; 
     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath]; 
     AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
     [fileURL release]; 
     self.audioPlayer = newPlayer; 
     [newPlayer release]; 
     [audioPlayer setDelegate:self]; 
     [audioPlayer prepareToPlay]; 
     [audioPlayer play]; 
    } 
+0

Hola HappyAppDeveloper, estoy atascado en este mismo problema. Hago lo mismo cuando hago la misma inicialización en setupAudioSession, pero mi sesión de captura siempre se detiene. ¿Sabes si esto se rompió para iOS6? – kungfoo

+0

funcionando perfectamente en iOS 5 y 6. Guardado mi tocino, gracias !!!!!!!!!!! – SpaceDog

+0

Si está utilizando ARC, el reproductor de audio debe declararse "fuerte". De lo contrario, podría ser lanzado temprano y no obtendrá ningún sonido. – Sten