2009-11-11 88 views
5

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

但在这里他们的建议似乎只是不工作;它似乎像MPMoviePlayerController为了自己的目的覆盖音频会话配置。理想情况下,我会将电影音频混合到iPod音频中,或者使用低音,但即使重新启动音乐也可能是一种可以修复的方法。 任何想法?

+0

只是一个快速的评论:与苹果来回发送电子邮件似乎表明,这可能是苹果方面的一个错误,他们不知道任何方式来解决这个特定的问题。 :( – jexe 2010-01-10 21:32:44

+0

Apple的任何更新?我已经遇到这个问题现在 – 2010-10-04 19:11:10

+0

您链接到的文档是指从您的应用程序中访问iPod库,而您已经表明您想要将您的音乐与来自iPod的应用程序 - 这是一个完全不同的东西 – 2010-11-03 22:17:23

回答

1

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

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

+0

不是真的,根据文档,并可能在一个新的固定版本,我不能谈论,并基本上确认现在我自己与苹果,这是一个错误在他们身边 – 2010-10-05 16:07:17

+0

你能发表一个例子吗?谢谢 – 2010-10-08 15:45:11

+0

如果你在谈论文档链接到通过@Jexe,它不是指iPod应用程序,而是iPod库访问,它允许更多的混合选项。我没有看到一个错误苹果方在这里。 – 2010-11-03 22:26:33

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

对我来说,它的工作精细!

+0

如果它是从AppStore安装的第三方应用程序,则这不起作用。无法恢复。任何解决方案 – honcheng 2011-08-12 00:43:30

+0

它在设备上进行测试时适用于我。你试过了吗? – 2011-08-18 09:55:40

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);