5

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

但是他们在这里的建议似乎不起作用。似乎 MPMoviePlayerController 出于自己的目的覆盖了音频会话配置。理想情况下,我会在 iPod 音频上混合电影音频,或者使用闪避,但即使重新启动音乐也可能是一个可以接受的修复。

4

3 回答 3

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];
}

对我来说效果很好!

于 2011-04-12T14:12:04.680 回答
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);
于 2011-11-05T19:04:54.397 回答
1

您在任何时候都只能拥有一个提供音乐的应用程序和多个(简短)声音来源。如果后台应用正在播放音乐,您的应用可以叠加简短的声音。如果要播放音乐,则必须停止后台应用程序。

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

于 2010-10-05T11:26:54.537 回答