2009-11-10 21 views
8

Estoy trabajando en una aplicación de grabadora de audio, está funcionando perfectamente bien.cómo reanudar la grabación después de la interrupción en el iphone?

Pero estoy atascado con el problema de la interrupción. Cuando recibe una llamada,

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder 

luego se invoca este método y la grabación se pausa.

Y si el usuario rechaza la llamada:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder 

Entonces aquí quiero reanudar la grabación desde el punto en que se interrumpió. Pero cuando vuelvo a llamar al método de grabación, la grabación comienza con un nuevo archivo.

+0

Por favor enviar el código que está utilizando para iniciar/detener la grabación/pausa. ¿Se está liberando cada vez que el AVAudioRecorder se opone y crea una nueva instancia? Esto puede explicar por qué cada vez que comienzas a grabar usando un archivo diferente. –

+0

Fyi, he creado una pequeña aplicación de muestra que muestra cómo End Int no funciona correctamente y he registrado una llamada con Apple sobre este tema. Ha estado con ellos durante> 2 meses y no han escuchado nada. – ort11

Respuesta

1

El sistema operativo probablemente esté deteniendo el AVAudioRecorder durante la interrupción. Puede presentar los dos o más archivos como una sola grabación para el usuario, o puede usar AudioQueue para escribir su código para manejar interrupciones (así como para guardar datos de audio en un archivo).

0

Intenté hacer esto hace un tiempo y llegué a la conclusión de que no se podía hacer correctamente; el sistema operativo en sí no te permitirá hacerlo. Tal vez eso haya cambiado en 3.1.2, pero cuando probé en 3.0 simplemente no funcionaría.

0

para manejar la interrupción, usted tiene que utilizar metodos AVAudioSessionDelegate en lugar de AVAudioRecorderDelegate methods.This es el ejemplo de código para el manejo de la interrupción:

/*================================================================= 
Interruption Handling Method during Recording 
==================================================================*/ 

- (void) beginInterruption 
{ 
if(self.recorder) 
     { 
    //Method to handle UI 
} 
} 

- (void) endInterruption 
{ 

NSError *err = noErr; 
[[AVAudioSession sharedInstance] setActive: YES error: &err]; 
if(err != noErr) 
{ 
    NSLog([err description]); 
} 
     //method to handle UI 
} 

Primer método desactivar automáticamente el session.So de audio, en el segundo método, tiene que reactivar la sesión de audio. El primer método pondrá en pausa la grabación y, cuando termine la interrupción, puede continuar con el segundo método. Lo he intentado con la versión 3.0 y la versión superior.

6

¡Ha solucionado el problema!

He vuelto a escribir el código de grabación para evitar este problema. Usé AudioQueues, básicamente el código de back-end es el mismo de la aplicación SpeakHere con algunos cambios menores. Proporcionó dos apis más en él:

-(void)resume 
{ 
    AudioQueueStart(queueObject, NULL); 
} 

-(void)pause 
{ 
    AudioQueuePause(queueObject); 
} 

En la clase AudioRecorder. El propósito básico es evitar la configuración de grabación que se realiza en el método de grabación.

Configure la devolución de llamada de interrupción y luego use esta pausa y reanude los métodos apropiadamente en la devolución de llamada. También tenga cuidado de configurar la sesión de audio activa en función de si su aplicación lo necesita o no.

Espero que esto ayude a alguien por ahí.

EDIT:

audio interrupción oyente de devolución de llamada:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) 
{ 
    if (interruptionState == kAudioSessionBeginInterruption) 
    { 
     [self.audioRecorder pause]; 
    } 
    else if (interruptionState == kAudioSessionEndInterruption) 
    { 
     // if the interruption was removed, and the app had been recording, resume recording 
     [self.audioRecorder resume]; 
    } 
} 

Para escuchar a la interrupción del sonido:

AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self); 
+0

¿Este enfoque puede reanudar la grabación desde un archivo existente incluso si la aplicación sale y vuelve a cargarse? – memmons

+0

No si sale y vuelve a cargarse, pero sí, se reanuda cuando la aplicación entra en primer plano cuando llamas -pausa y -recomienda las API de forma adecuada antes de que tu aplicación pase al segundo plano y después de que aparezca en primer plano. –

+0

¿Usó AudioQueues para todo el proceso de grabación? – Siddharth

Cuestiones relacionadas