MPMoviePlayerController停止播放iPod并且不重新启动

时间:2009-11-11 15:43:48

标签: iphone audio mpmovieplayercontroller

我有一个带有简短介绍视频的iPhone应用程序。如果用户在iPod正在播放音乐时启动应用程序,音乐将在视频播放时停止(无论视频是否有声音),并且视频播放后音频将永久停止。 Apple似乎表明你可以使用AudioSession技巧来解决这个问题: http://www.devworld.apple.com/iphone/library/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/WorkingWithOpenALiPodMusicandMovies/WorkingWithOpenALiPodMusicandMovies.html

但是他们的建议似乎没有用;似乎MPMoviePlayerController会为了自己的目的覆盖音频会话配置。理想情况下,我将电影音频混合在iPod音频上,或者可能使用闪避,但即使重新启动音乐也可能是一个可以修复的问题。 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我找到了一个很好的解决方案。在.h文件中,您必须创建一个名为“wasPlaying”的BOOL。在播放视频之前,请询问iPod是否正在播放。

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

然后,在您告诉电影播放器​​播放之后,请拨打以下电话:

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

然后,在方法finishedPlaying:

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

对我而言,它运作良好!

答案 1 :(得分:2)

我认为您可以通过初始化类似于此的音频会话来完成此操作:

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

然后,当您想要使用音频会话时,您可以设置iPod音频以避开视频轨道:

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

答案 2 :(得分:1)

您只能随时拥有一个提供音乐的应用以及多种(简短)声音源。如果后台应用正在播放音乐,您的应用可以覆盖简短的声音。如果您想播放音乐,必须停止后台应用。

所以我不认为你使用MPMoviePlayerController(或任何高级音频框架)可以实现的目标。您可能能够覆盖电影的音轨,如果它足够短但MPMoviePlayerController可能不适合这个。