2011-01-31 51 views
21

我正在为iPhone开发一个交互式故事书类型应用程序,而且我最近遇到了关于设备上混音的令人沮丧的错误。MPMoviePlayerController和AVAudioPlayer音频混合故障

首先,我设置了一个音频会话。我将类别设置为AVAudioSessionCategoryAmbient然后初始化并播放我的AVAudioPlayer实例。现在,在音频播放的背景中,我预先加载了一个视频,使用MPMoviePlayerController,然后致电prepareToPlay。我以这种方式预加载视频的原因是因为我需要在相当严格的时间后立即播放视频。

在此配置中,音频/电影可以正常工作,并且它们混合并且不会彼此中断。但是,这种特殊的音频会话类别不允许音频在设备锁定时继续播放,这是我真正需要的功能。因此我不得不考虑一个不同的类别:AVAudioSessionCategoryPlayback

默认情况下,此类别不允许与其他音频混合,according to the Apple docs。为了能够与其他音频我重写相关的类别混合:

OSStatus propertySetError = 0; 
UInt32 setProperty = 1; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty), &setProperty); 
assert(propertySetError == 0); 

不幸的是,这解决了我的演奏,而锁定的问题,而是引入了另一个问题:AVAudioPlayer音频将暂时中断的视频负载有轻微口吃。口吃很小,可能不到一秒钟,但足以破坏用户体验。我已阅读this related post,这使我可以预先加载视频,其中包括AVAudioSessionCategoryAmbient,但不幸的是,同样的方法似乎不适用于新类别。

根据返回码成功应用音频会话类别。有谁知道为什么启用混音与这个类别不同于环境类别提供的混音设备?

+0

欢迎来到StackOverflow。很好的问题! – Moshe 2011-01-31 18:05:28

回答

1

我发现处理类似问题的最佳方式是使用较新的AVPlayer(+1 @adam)并设置您的应用以启用背景音频并接收遥控器通知。我被@MarquelV告知了这一点:How can you play music from the iPod app while still receiving remote control events in your app?

如果你可以让后台工作正常工作,那应该可以让你在设备被锁定时继续播放。哦,不要忘记添加钥匙到info.plist,它很容易做,然后不知道为什么它不工作。