2012-07-26 13 views
12

Estoy configurando una sesión de audio de AVA cuando la aplicación se inicia y establezco el delegado en la aplicaciónDelegate. Todo parece estar funcionando (reproducción, etc.) excepto que beginInterruption en el delegado no se está llamando cuando el teléfono recibe una llamada. Cuando la llamada finaliza, se llama a la interrupción.AVAudioSessionDelegate llamado at endInterruption, pero beginInterruption no se llama

La única idea que tengo es que el código del reproductor de audio que estoy utilizando solía estar basado en AVAudioPlayer, pero ahora está usando AVPlayer. Las devoluciones de llamada para el delegado de AVAudioPlayer para el manejo de interrupciones todavía están allí, pero parece extraño que entren en conflicto de alguna manera.

+0

Estoy golpeando la misma situación, Andrew, pudiste resolver el problema? – Ethan

+0

¿Ve el problema en iOS 5.x? – farski

+0

Estoy viendo lo mismo en iOS 6 solamente. Acabo de actualizar, pero no funciona. Avísame si lo resolviste. –

Respuesta

8

Al mirar el encabezado, en iOS6, parece que AVAudioSessionDelegate ahora está en desuso.

Use AVAudioSessionInterruptionNotification en su lugar en iOS6.

Actualización: Eso no funcionó. Creo que hay un error en el marco.

Sí, en mi experiencia, beginInterruption, ni la recién documentada AVAudioSessionInterruptionNotification funcionan correctamente. Lo que tenía que hacer era rastrear el estado del jugador usando una bandera local, luego manejar el método endInterruption:withFlags: para rastrear la recuperación de interrupciones.

Con iOS 6, la reanudación de una interrupción al menos mantendrá su AudioPlayer en el lugar correcto, así que no tuve la necesidad de almacenar el último tiempo de reproducción conocido de mi AVAudioPlayer, simplemente tuve que presionar play.

Aquí está la solución que se me ocurrió. Parece que iOS 6 mata tu audio con un restablecimiento de medios si un AVPlayer permanece residente demasiado tiempo. Lo que termina sucediendo es que el AVPlayer se reproduce, pero no sale sonido. La tasa en el AVPlayer es 1, pero no hay absolutamente ningún sonido. Para agregarle más dolor a la situación, no hay ningún error en el AVAudioSession setActive, ni en el propio AVPlayer que indica que hay un problema.

Agregue al hecho de que no puede depender de appWillResignActive, porque es posible que su aplicación ya esté en segundo plano si depende de los gestos de control remoto.

La solución final que implementé fue agregar un observador periódico en el AVPlayer y registrar la última hora conocida. Cuando recibo el evento de que me devolvieron el control, creo un nuevo AVPlayer, lo cargo con AVPlayerItem y seekToTime en el momento adecuado.

Es una solución bastante molesta, pero al menos funciona y evita los bloqueos periódicos que estaban ocurriendo.

+1

De acuerdo. ¡Ni AVAudioSessionInterruptionNotification ni AVAudioSessionRouteChangeNotification parecen funcionar! He archivado un error con Apple, y recomiendo a otros que hagan lo mismo con la esperanza de tener esta API arreglada en 6.1. https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/wa/signIn – clozach

4

Puedo confirmar que usando la API C, el método de interrupción tampoco se llama cuando comienza la interrupción; solo cuando termina

(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self)); 

También he presentado un informe de error con Apple para el problema.

Editar: Esto se corrige en iOS 6.1 (pero no IOS 6.0.1)

+0

No estoy seguro de si hay un problema con la configuración del código, pero veo que se llama a la devolución de llamada de interrupción de la sesión de audio cuando la interrupción comienza en un dispositivo iOS 6. – hotpaw2

+0

Interesante - He [cargado el ejemplo] (http://mixandmash.co.uk/sam/AudioInterruptions.zip) Envié a Apple - ¿Podría probarlo y ver si se imprime el NSLog para notificar el comienzo de ¿una interrupción? Sería interesante saber si estás configurando tus sesiones de audio de manera diferente? –

+0

El proyecto que mencioné anteriormente funciona correctamente en ios 6.1 beta –

0

acabo de comprobar en mi iPhone 5 (iOS 6.0) mediante el establecimiento de un punto de interrupción en la función de devolución de llamada AudioSessionInterruptionListener que fue declarada en AudioSessionInitialize(), y esta devolución de llamada, de hecho, recibe una llamada cuando la aplicación tiene una sesión de audio activa y una unidad de audio y se interrumpe con una llamada entrante (Xcode muestra la aplicación parada en el punto de interrupción al comienzo de la interrupción , de la cual luego continúo).

Tengo la aplicación, detengo su unidad de audio y desactivo su sesión de audio. Luego, en la devolución de llamada de interrupción final, la aplicación vuelve a activar la sesión de audio y reinicia la unidad de audio sin problemas (la aplicación está grabando el audio correctamente después).

+0

El problema parece surgir solo para mí si codificamos directamente a mpeg4aac. Cualquier otro códec y cosas funcionan bien. ¿Qué estabas usando como formato de archivo? –

0

Creé una nueva aplicación de transmisión de audio (AVPlayer) encima de iOS 6.0.x y encontré el mismo problema.

Delegados ahora están en desuso y tenemos que utilizar las notificaciones, que es grande, sin embargo aquí está mi hallazgos:

  1. Durante una llamada telefónica entrante sólo obtengo AVAudioSessionInterruptionTypeEnded en mi manejador, junto con AVAudioSessionInterruptionOptionShouldResume. La sesión de audio se suspende automáticamente (se atenúa el audio) y solo necesito reanudar la reproducción de AVPlayer.
  2. Sin embargo, cuando intento lanzar un juego, como CSR Racing, extraño el temido AVAudioSessionInterruptionTypeBegan, pero no aparece ninguna señal cuando mi aplicación puede reanudar la reproducción, ni siquiera matar el juego.

Ahora, esto puede depender de otros factores, como mi categoría de audio (en mi caso AVAudioSessionCategoryPlayback) y los ajustes de mezcla de ambas aplicaciones (kAudioSessionProperty_OverrideCategoryMixWithOthers), no estoy seguro, pero que sin duda ver algo fuera de lugar.

Esperemos que otros informaron que en 6.1beta esto es fijo y aún tengo que actualizar, así que ya veremos.

2

Sólo tiene que llamar:

[[AVAudioSession sharedInstance] setDelegate: self]; 
+0

¿Eso disparará beginInterruption? – farski

Cuestiones relacionadas