我正在为iPhone开发一个交互式故事书类型的应用程序,我最近遇到了一个令人沮丧的有关设备上音频混合的错误.
首先,我设置了一个音频会话.我将类别设置为AVAudioSessionCategoryAmbient,然后初始化并播放我的AVAudioPlayer实例.现在,在播放音频的背景中,我正在预加载要使用MPMoviePlayerController播放的视频,然后调用prepareToPlay.我以这种方式预加载视频的原因是因为我需要它以后相当严格的时间立即播放.
在此配置中,音频/电影工作正常,它们混合并且不会相互中断.但是,此特定音频会话类别不允许音频在设备锁定时继续播放,这是我真正需要的功能.因此,我不得不考虑另一个类别:AVAudioSessionCategoryPlayback.
根据Apple文档,默认情况下,此类别不允许与其他音频混合.为了能够与其他音频混音,我将覆盖相关类别:
OSStatus propertySetError = 0;
UInt32 setProperty = 1;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty), &setProperty);
assert(propertySetError == 0);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这解决了我在锁定问题时的播放问题,但又引入了另一个问题:AVAudioPlayer音频在视频加载时会短暂中断.口吃很小,可能不到一秒钟,但足以破坏用户体验.我已经阅读了这篇相关文章,它使我能够使用AVAudioSessionCategoryAmbient预加载视频,但不幸的是,相同的方法似乎不适用于新类别.
根据返回码,成功应用音频会话类别.有谁知道为什么启用此类别的音频混合与环境类别提供的混音设施不同?