2011-01-17 13 views
5

Escribí una aplicación para grabar videos desde el iPhone. Funciona bien, pero tiene un gran problema. Cuando se inicia AVCaptureSession y el usuario intenta reproducir el audio de su biblioteca (iPod). Esta acción hará que AVCaptureSession finalice. ¿Alguna idea puede evitar que el usuario intente reproducir audio o resolver este problema?El audio hará que AVCaptureSession termine


este es mi código:

videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];   
audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 

AVCaptureDeviceInput *videoDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoDevice error:nil]; 
AVCaptureDeviceInput *audioDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioDevice error:nil]; 

movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

captureSession = [[AVCaptureSession alloc] init]; 

[captureSession beginConfiguration]; 
[captureSession setSessionPreset:AVCaptureSessionPresetHigh]; 
[captureSession addInput:videoDeviceInput]; 
[captureSession addInput:audioDeviceInput]; 
[captureSession addOutput:movieFileOutput]; 
[captureSession commitConfiguration]; 

[captureSession startRunning]; 
+0

¿Alguna vez encontró una solución para esto? – Sandy

+0

¿Alguna vez encontró una solución @anistar? –

+0

Desafortunadamente me he topado con el mismo problema, ¿alguna idea? – nixau

Respuesta

0

Es necesario utilizar el NSNotificationCenter. Use el siguiente código (también incluí algunos otros métodos útiles) y escriba un método para AVCaptureSessionWasInterruptedNotification que manejará la interrupción de la captura, de cualquier manera. Espero que eso ayude.

NSNotificationCenter *notify = [NSNotificationCenter defaultCenter]; 
[notify addObserver: self selector: @selector(onVideoError:) name: AVCaptureSessionRuntimeErrorNotification object: captureSession]; 
[notify addObserver: self selector: @selector(onVideoInterrupted:) name: AVCaptureSessionWasInterruptedNotification object: captureSession]; 
[notify addObserver: self selector: @selector(onVideoEnded:) name: AVCaptureSessionInterruptionEndedNotification object: captureSession]; 
[notify addObserver: self selector: @selector(onVideoDidStopRunning:) name: AVCaptureSessionDidStopRunningNotification object: captureSession]; 
[notify addObserver: self selector: @selector(onVideoStart:) name: AVCaptureSessionDidStartRunningNotification object: captureSession]; 
+1

¿Pero qué tipo de cosas debe detener o ahorrar en una interrupción para asegurarse de que siga funcionando? – Alper

0

¡Intente jugar con la sesión de audio!

Aquí es una conjetura rápida sobre lo que podría hacer, pero no he probado esto con el iPod específicamente:

OSStatus status = noErr; 
status |= AudioSessionInitialize(CFRunLoopGetMain(), kCFRunLoopCommonModes, PVAudioSessionInterruptionListener, NULL); 

    status |= AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(UInt32), &(UInt32){kAudioSessionCategory_PlayAndRecord}); 

    status |= AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, 
             sizeof(UInt32), 
             &(UInt32){true}); 

    status |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, 
             sizeof(UInt32), 
             &(UInt32){false}); 

status |= AudioSessionSetActive(YES); 

if (status != noErr) { 
    NSLog(@"ERROR: There was an error in setting the audio session"); 
} 

También he tenido un poco de suerte con el ambiente categoría de audio sonido (aunque da un error, que parece permitir la reproducción de audio durante la grabación de vídeo):

status |= AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(UInt32), &(UInt32){kAudioSessionCategory_AmbientSound}); 
1

Esto funcionó para mí:

- (void)setupAudio { 
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil]; 
    UInt32 doSetProperty = 1; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 
    [[AVAudioSession sharedInstance] setActive: YES error: nil]; 

}

+0

¿cómo agregaron esto a su sesión de captura aunque, pueden proporcionar más código? –

+0

Disculpas, han pasado varios años desde que tuve que ver esto y no puedo proporcionar ningún contexto real más allá de lo que está aquí. – micahp

Cuestiones relacionadas