2009-11-11 16 views
5

Tengo una aplicación para iPhone con un breve video de introducción. Si un usuario inicia la aplicación mientras su iPod está reproduciendo música, la música se detendrá mientras se reproduce el video (tanto si el video tiene sonido como si no) y el audio se detendrá permanentemente después de la reproducción del video. Apple parece indicar que se puede resolver esto con trucos AudioSession: http://www.devworld.apple.com/iphone/library/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/WorkingWithOpenALiPodMusicandMovies/WorkingWithOpenALiPodMusicandMovies.htmlMPMoviePlayerController detiene la reproducción del iPod y no se reinicia

Pero simplemente no parecen sus sugerencias aquí a trabajar; parece que MPMoviePlayerController anula la configuración de la sesión de audio para sus propios fines. Idealmente, mezclaría el audio de la película con el audio del iPod o tal vez usaría el modo ducking, pero incluso reiniciar la música podría ser una solución aceptable. Alguna idea?

+0

Solo un comentario rápido: el correo electrónico de ida y vuelta con Apple parece indicar que este es probablemente un error del lado de Apple, y no conocen ninguna forma de resolver este problema en particular. :( – jexe

+0

¿Alguna actualización de Apple? Me he encontrado con este problema ahora –

+0

el documento que ha vinculado hace referencia al acceso de la biblioteca de iPod desde su aplicación, mientras que ha indicado que desea mezclar su música con la música procedente del Aplicación iPod, que es algo completamente diferente. –

Respuesta

1

Solo puede tener una aplicación de música en cualquier momento y varias fuentes de sonidos (breves). Si una aplicación en segundo plano reproduce música, tu aplicación puede superponer sonidos breves. Si desea reproducir música, la aplicación en segundo plano debe detenerse.

Así que no creo que lo que estás tratando de lograr sea posible usando MPMoviePlayerController (o cualquiera de los marcos de audio de alto nivel). Es posible que pueda superponer una pista de audio de una película, si es suficientemente corta, pero MPMoviePlayerController probablemente no sea bueno para esto.

+0

No es cierto, es posible de acuerdo con el documentación, y posible en una nueva versión fija de la que no puedo hablar y que básicamente me confirmó a mí mismo con Apple que es un error de su parte. –

+0

¿Puede publicar un ejemplo? Gracias. –

+0

Si está hablando del documento vinculado a por @Jexe, no se refiere a la aplicación del iPod, sino al acceso a la biblioteca del iPod, que permite más opciones de mezcla. No veo un error en El lado de Apple aquí. –

2

He encontrado una gran solución para eso. En el archivo .h, debe crear un BOOL llamado "wasPlaying". Antes de reproducir su video, le pregunta al iPod si se estaba reproduciendo.

if ([[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying) 
{ 
    NSLog(@"Music was playing, lets put YES to the bool"); 
    wasPlaying = YES; 
} 

Entonces, después le dice al reproductor de películas para jugar, se llama al siguiente:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedPlaying) name:MPMoviePlayerPlaybackDidFinishNotification object: moviePlayer]; 

Y después de eso, en el método finishedPlaying:

if (wasPlaying ==YES) 
{ 
    NSLog(@"Music was playing, lets play music again"); 
    [[MPMusicPlayerController iPodMusicPlayer] play]; 
} 

Para mí funcionó ¡multa!

+0

Esto no funciona si se trata de una aplicación de terceros instalada desde la AppStore. No se puede reanudar ¿Alguna solución? – honcheng

+0

Funcionó para mí mientras probaba en el dispositivo. ¿Has intentado en el tuyo? –

2

Creo que se puede hacer esto mediante la inicialización de la sesión de audio similar a esto:

NSError *audioSessionError = nil; 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryAmbient 
          error:&audioSessionError] == YES) 

Luego, cuando se desea utilizar la sesión de audio se puede ajustar el iPod de audio para eludir la pista de vídeo:

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 
propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing); 
AudioSessionSetActive(YES); 
Cuestiones relacionadas