音频会话


音频会话接口提供的特性

范畴
范畴是标识一组应用程序音频行为的键。您可以通过范畴的设置来指示自己希望得到的音频行为,比如希望在屏幕锁定状态时继续播放音频。

中断和路由变化
当您的音频发生中断或中断结束,以及当硬件音频路由发生变化时,音频会话会发出通告,使您可以优雅地响应发生在更大音频环境中的变化—比如由于电话呼入而导致的中断。

硬件特征

您可以通过查询音频会话来了解应用程序所在的设备的特征,比如硬件采样率,硬件通道数量,以及是否有音频输入。

AVAudioSession类参考和AVAudioSessionDelegate协议参考描述了一个管理音频会话的精简接口。如果要使音频会话支持中断,则可以直接使用基于C语言的音频会话服务接口,该接口的描述请见音频会话服务参考AudioToolbox/AudioToolbox.h。在应用程序中,这两个接口的代码可以混用及互相匹配。


处理音频中断

音频技术   中断如何工作

系统声音服务 
当中断开始时,系统声音和警告声音会变为无声。如果中断结束—当用户取消警告或选择忽略呼入电话时,会发生这种情况—它们就又自动变为可用。使用这种技术的应用程序无法影响声音中断的行为。

音频队列服务、OpenAL、I/O音频单元
这些技术为中断的处理提供最大的灵活性。您需要编写一个中断监听回调函数,具体描述请参见音频会话编程指南中的 “响应音频中断”部分。

AVAudioPlayer类
AVAudioPlayer类为中断的开始和结束提供了委托方法。根据实际的需要,您可以在audioPlayerBeginInterruption:方法中更新用户界面,音频播放器对象会负责暂停回放。您也可以利用audioPlayerEndInterruption:方法来重启音频的回放,并在必要时更新用户界面。音频播放器会负责重新激活您的音频会话。

每个iPhone OS应用程序—除了很少的例外—都应该采纳音频会话服务


通过AVAudioPlayer类轻松播放声音


AVAudioPlayer
类提供了一个简单的Objective-C接口,用于播放声音。如果您的应用程序不需要立体声或精确同步,且不播放来自网络数据流的音频,则我们推荐您使用这个类来回放声音。

通过音频播放器可以实现如下任务:


播放任意长度的声音
播放文件或内存缓冲区中的声音
循环播放声音
同时播放多路声音(虽然不能精确同步)
控制每个正在播放声音的相对音量
跳到声音文件的特定点上,这可以为需要快进和反绕的应用程序提供支持
取得音频强度数据,用于测量音量


AVAudioPlayer
类可以播放iPhone OS上有的所有音频格式,具体描述请参见“音频回放和录制格式”部分。或者。如果您需要该类接口的完整描述,请参见AVAudioPlayer类参考

为了使音频播放器播放音频,您需要为其分配一个声音文件,使其做好播放的准备,并为其指定一个委托对象


用音频队列服务播放和控制声音

音频队列服务(Audio Queue Services)加入了一些
AVAudioPlayer
类不具有的回放能力。通过音频队列服务进行回放可以:


精确计划声音的播放,支持声音的同步。
精确控制音量—基于一个个的缓冲区。
通过音频文件流服务(Audio File Stream Services)来播放从流中捕捉的音频。

音频队列服务可以播放iPhone OS支持的所有音频格式,具体描述请见“音频回放和录制格式”部分;还支持录制,详见“录制音频”部分。


创建一个音频队列对象

创建一个音频队列对象需要下面三个步骤:


创建管理音频队列所需的数据结构,比如您希望播放的音频格式。
定义管理音频队列缓冲区的回调函数。在回调函数中,您可以使用音频文件服务来读取希望播放的文件(在iPhone OS 2.1及更高版本中,您还可以用扩展音频文件服务来读取文件)。
通过
AudioQueueNewOutput
函数实例化回放音频队列。
解析音频流

为了播放音频流内容,比如来自网络连接的音频流,可以结合使用音频文件流服务和音频队列服务。音频文件流服务负责从常见的、采用网络位流格式的音频文件容器中解析出音频数据和元数据。您也可以用它来解析磁盘文件中的数据包和元数据。

iPhone OS可以解析的音频文件和位流格式和Mac OS X相同,具体如下:


MPEG-1 Audio Layer 3,用于.mp3文件
MPEG-2 ADTS,用于.aac音频数据格式
AIFC
AIFF
CAF
MPEG-4,用于.m4a、.mp4、和.3gp文件
NeXT
WAVE

在取得音频数据包之后,您就可以以任何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>是开发工具所在的目录。


原文地址:https://www.cnblogs.com/qq78292959/p/2076939.html