范畴
范畴是标识一组应用程序音频行为的键。您可以通过范畴的设置来指示自己希望得到的音频行为,比如希望在屏幕锁定状态时继续播放音频。
中断和路由变化
当您的音频发生中断或中断结束,以及当硬件音频路由发生变化时,音频会话会发出通告,使您可以优雅地响应发生在更大音频环境中的变化—比如由于电话呼入而导致的中断。
硬件特征
您可以通过查询音频会话来了解应用程序所在的设备的特征,比如硬件采样率,硬件通道数量,以及是否有音频输入。
AVAudioSession类参考和AVAudioSessionDelegate协议参考描述了一个管理音频会话的精简接口。如果要使音频会话支持中断,则可以直接使用基于C语言的音频会话服务接口,该接口的描述请见音频会话服务参考AudioToolbox/AudioToolbox.h。在应用程序中,这两个接口的代码可以混用及互相匹配。
音频技术 中断如何工作
系统声音服务
当中断开始时,系统声音和警告声音会变为无声。如果中断结束—当用户取消警告或选择忽略呼入电话时,会发生这种情况—它们就又自动变为可用。使用这种技术的应用程序无法影响声音中断的行为。
音频队列服务、OpenAL、I/O音频单元
这些技术为中断的处理提供最大的灵活性。您需要编写一个中断监听回调函数,具体描述请参见音频会话编程指南中的 “响应音频中断”部分。
AVAudioPlayer类
AVAudioPlayer类为中断的开始和结束提供了委托方法。根据实际的需要,您可以在audioPlayerBeginInterruption:方法中更新用户界面,音频播放器对象会负责暂停回放。您也可以利用audioPlayerEndInterruption:方法来重启音频的回放,并在必要时更新用户界面。音频播放器会负责重新激活您的音频会话。
每个iPhone OS应用程序—除了很少的例外—都应该采纳音频会话服务
AVAudioPlayer
类提供了一个简单的Objective-C接口,用于播放声音。如果您的应用程序不需要立体声或精确同步,且不播放来自网络数据流的音频,则我们推荐您使用这个类来回放声音。
通过音频播放器可以实现如下任务:
AVAudioPlayer
类可以播放iPhone OS上有的所有音频格式,具体描述请参见“音频回放和录制格式”部分。或者。如果您需要该类接口的完整描述,请参见AVAudioPlayer类参考。
为了使音频播放器播放音频,您需要为其分配一个声音文件,使其做好播放的准备,并为其指定一个委托对象
音频队列服务(Audio Queue Services)加入了一些
AVAudioPlayer
类不具有的回放能力。通过音频队列服务进行回放可以:
音频队列服务可以播放iPhone OS支持的所有音频格式,具体描述请见“音频回放和录制格式”部分;还支持录制,详见“录制音频”部分。
创建一个音频队列对象需要下面三个步骤:
为了播放音频流内容,比如来自网络连接的音频流,可以结合使用音频文件流服务和音频队列服务。音频文件流服务负责从常见的、采用网络位流格式的音频文件容器中解析出音频数据和元数据。您也可以用它来解析磁盘文件中的数据包和元数据。
iPhone OS可以解析的音频文件和位流格式和Mac OS X相同,具体如下:
在取得音频数据包之后,您就可以以任何iPhone OS系统支持的格式进行播放,这些格式在“音频回放和录制格式”部分中列出。
为了获得最好的性能,处理网络音频流的应用程序应该仅使用来自Wi-Fi连接的数据。您可以通过iPhone OS提供的System Configuration框架及其
SCNetworkReachability.h
头文件定义的接口来确定什么网络是可到达和可用的。如果需要实例代码,请参见iPhone Dev Center网站的Reachability工程。
为了连接网络音频流,可以使用iPhone OS系统中的Core Foundation框架中的接口,比如
CFHTTPMesaage
接口,具体描述请见CFHTTPMessage参考。通过音频文件流服务解析网络数据包,将它恢复为音频数据包,然后放入缓冲区,发送给负责回放的音频队列对象。
音频文件流服务依赖于音频文件服务定义的接口,比如
AudioFramePacketTranslation
结构和
AudioFilePacketTableInfo
结构,具体描述请见音频文件服务参考。
有关如何使用流的更多信息,请参见音频文件流服务参考。实例代码则请参见位于<Xcode>
/Examples/CoreAudio/Services/
目录下的AudioFileStream例子工程,其中<Xcode>是开发工具所在的目录。