iphone ios avplayer avaudiosession

iphone - Detectar cuando AVAudioSession está siendo "Ducked"



avplayer (6)

En tu clase AppDelegate.m y en la función didFinishLaunchingWithOptions , escucha la siguiente notificación

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil];

y fuera del método de inicio de la aplicación, implemente el selector como

- (void)audioSessionInterruption:(NSNotification *)notif{ NSLog(@"/n/nInterruption Notification :%@/n/n",notif.userInfo); }

Espero que esto funcione para usted....

Estoy trabajando en una aplicación de Podcast. Esto reproduce audio usando el tipo de sesión AVAudioSessionCategoryPlayback . Esto hace casi todo lo que yo quiero que haga. Hace una pausa en la reproducción de otra música, se interrumpe cuando entra una llamada y generalmente funciona exactamente como lo deseo.

Con una excepción. Cuando se reproduce el audio de mayor prioridad (por ejemplo, cuando se ejecuta una aplicación de navegación giro a giro), el audio de mi aplicación se reduce en volumen pero continúa ejecutándose. Esto crea una mezcla horrible de las dos voces que no se desea. En su lugar, preferiría que el audio en mi aplicación se detenga durante el sonido reproducido y luego continúe una vez que termine.

He intentado cambiar las diferentes propiedades de AVAudioSession como AVAudioSessionCategoryOptionMixWithOthers , pero esto solo cambia la forma en que los sonidos de menor prioridad se combinan con mi aplicación. No cambian la forma en que se mezcla la mía con los sonidos de mayor prioridad. También intenté observar la propiedad otherAudioPlaying de sharedSession pero esto no sharedSession cambios cuando se superponen estos cortos clips.

¿Hay alguna forma de detectar cuándo el audio de mi aplicación se está modificando para que pueda hacer una pausa? ¿O, alternativamente, para evitar que el audio de mi aplicación se elimine para que pueda tratar estos otros sonidos como interrupciones?

Gracias.


Es posible que desee examinar las interrupciones y simplemente descartar su sesión de audio cuando se interrumpe, luego reanudarla cuando finalice la interrupción, de la siguiente manera:

En su ViewDidLoad:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; if ([self canBecomeFirstResponder]) { [self becomeFirstResponder]; }

Manejar las notificaciones:

static NSInteger audioSessionActiveCounter = 0; - (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification { AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; if (AVAudioSessionInterruptionTypeBegan == interruptionType) { DDLogVerbose(@"Session interrupted: --- Begin Interruption ---"); // stop your session here with a setActive:NO } else if (AVAudioSessionInterruptionTypeEnded == interruptionType) { DDLogVerbose(@"Session interrupted: --- End Interruption ---"); // resume your session here with a setActive:YES } }

Espero eso ayude.


Escribí a Apple DTS sobre este problema. Aquí está lo que volví:

Gracias por ponerse en contacto con el Soporte técnico para desarrolladores de Apple (DTS). Nuestros ingenieros han revisado su solicitud y han llegado a la conclusión de que no existe una forma compatible de lograr la funcionalidad deseada, dadas las configuraciones del sistema de envío actuales.

Si desea que Apple considere agregar soporte en el futuro para permitir / notificar a la aplicación en segundo plano que deje de reproducir el audio cuando la aplicación en primer plano elija eliminar otro audio, entonces habilite la aplicación en segundo plano para iniciar el audio nuevamente después de completar la instalación, envíe un solicitud de mejora a través de la herramienta Bug Reporter en http://bugreport.apple.com .

Parece que ahora es imposible, lamentablemente.



No creo que se deba llamar de nuevo a kAudioSessionProperty_OtherAudioIsPlaying; puede ser que tenga que sondear este valor de forma regular.

Debe devolver un valor distinto de cero cuando se reproduce otro audio en el dispositivo. Esto puede no indicar que está siendo "pateado" per se, pero indicaría que otro audio se mezcla con su audio. Supuestamente, solo se anularía si la otra aplicación configurara la propiedad kAudioSessionProperty_OtherMixableAudioShouldDuck de su sesión de audio.

Con respecto al sondeo: sí, puede que no sea tan elegante como una devolución de llamada, pero a veces es necesario y sospecho que el sondeo de este valor es un golpe menor.

Espero que esto ayude.


Nunca hice esto, pero me imagino que podría usar AudioSession services C function audioSessionAddPropertyListener para registrar su devolución de llamada para kAudioSessionProperty_OtherAudioIsPlaying.

Tenga en cuenta que existe cierta confusión en la documentación de "FLATDACTED" y en los Apple DevForums acerca de la posibilidad de que todas o algunas de las funciones de AudioSession C queden en desuso "en el futuro".