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