audio session category:is a key that identifies a set of audio behaviors for your application.通过定义你category告知系统你的应用的意图,比如锁屏时候,是否需要继续播放音乐。有六个category,通过开关设置(YES OR NO)来控制你应用的行为。
audio session是在应用程序启动自动激活的。
audio session默认的行为:
播放功能启用和录音功能禁用。
当用户移动静音开关(iPhone上的响铃/静音开关)的“沉默”的位置,您的音频静音。
当用户按下“睡眠/唤醒“按钮,在屏幕锁定或自动锁定期限届满时,您的音频静音。
您的音频开始时,其他音频设备,如iPod的音频已经沉默。
以上这些行为被封装在AVAudioSessionCategorySoloAmbient类中,默认的category往往不是我们需要的。
默认的设置不适合的几种场景:
1:你听着音乐,过了一段时间,系统自动锁屏,音乐静音,这是需要设置category的AVAudioSessionCategoryPlayback。
2:确保iPod音乐是没有被中断,配置您的audio session允许混合。使用AVAudioSessionCategoryAmbient
3:写了一个视屏播放程序,当用户看视频看到一半的时候,突然来了一个电话,用户处理完成之后,点击播放按钮,就没有效果,必须得重头播放。这时候的处理就是写一个回调方法,继续刚才的视频。
Audio Session处理有两个API:
1:AVAudioSession类,用objective-c实现,使用这个API有两个优势,第一获取Audio Session的单例和C的API一样。第二你可以利用简单的委托方法处理音频中断和改变硬件配置,如采样率和信道数。你可以使用这些委托方法不管你使用音频技术为播放,录音,或处理。
2:Audio Session Services:是用C写的一个一个类,提供对所有的基本和高级特性的操作。
这两个API是互相兼容的,可以同时使用。
使用模拟器,以下几个方式是不行的:
1:调用中断
2:更改静音开关的设置
3:模拟屏幕锁定
4:模拟插上或拔下耳机
5:Query audio route information or test audio session category behavior
6:音频的混合测试(同时ipod和你的应用)
配置audio session:
初始化audio session:使用 AV Foundation framework来处理中断,苹果推荐使用隐士的初始化session,当你在处理AVAudioSession,AVAudioPlayer,AVAudioRecorder这些类的代理方法时候。
// implicitly initializes your audio session AVAudioSession *session = [AVAudioSession sharedInstance];
当然你也可以用C写一个回调函数来处理中断。
一般会在应用启动的时候初始化session,一般也在viewDidLoad中写初始化代码,系统在闹钟,电话,日历等提醒音时候会禁用session,然后处理完之后又开启。苹果建议使用AVAudioSessionDelegate的代理类来reactive(重新激活)session。
苹果的六个audio session category作用:
1:Three for playback
2:One for recording
3:One that supports playback and recording—that need not occur simultaneously
4:One for offline audio processing
以下是六个category:
1:AVAudioSessionCategoryAmbient(或者使用kAudioSessionCategory_AmbientSound)
2:AVAudioSessionCategorySoloAmbient(或者使用kAudioSessionCategory_SoloAmbientSound)
3:AVAudioSessionCategoryPlayback(或者使用kAudioSessionCategory_MediaPlayback)
4:AVAudioSessionCategoryRecord(或者使用kAudioSessionCategory_RecordAudio)
5:AVAudioSessionCategoryPlayAndRecord(或者使用kAudioSessionCategory_PlayAndRecord)
6:AVAudioSessionCategoryAudioProcessing(或者使用kAudioSessionCategory_AudioProcessing)
可以在viewdidiload方法中查看这些属性的值。
Audio Session Category最好在启动的时候设置,然后不要改变它。
Audio中断的处理方式:
1:使用AV Foundation framework里面定义的delegate方法处理
2:使用C语言的回调函数处理
What needs to happen during an audio session interruption
处理中断的技术:
1:AV Foundation framework的AVAudioPlayer和AVAudioRecorder类
2:Audio Queue Services, I/O audio unit
3:OpenAL
4:System Sound Services
An audio session gets interrupted
AVAudioSessionDelegate的两个方法来处理:beginInterruption和endInterruption
AVAudioRecorder和AVAudioPlayback的代理也提供
audioPlayerBeginInterruption、 audioPlayerEndInterruption、audioRecorderBeginInterruption、audioRecorderEndInterruption
使用c语言的回调来处理中断
//The interruption callback declaration typedef void (*AudioSessionInterruptionListener) ( void *inClientData, UInt32 inInterruptionState ); //两个inInterruptionState,kAudioSessionBeginInterruption和kAudioSessionEndInterruption
An audio hardware route:是一个有线电子通道的音频信号,类似耳机拔插或者介入其他硬件设备
void MyPropertyListener ( void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData );
audio session API可以指定硬件的采样频率和I/O缓冲区。已到达优化的作用,设置属性AudioSessionSetProperty值kAudioSessionProperty_PreferredHardwareSampleRate和kAudioSessionProperty_PreferredHardwareIOBufferDuration,最好是在inactive状态就设置好了
可以查询硬件的特征,通过访问属性kAudioSessionProperty_-
CurrentHardwareSampleRate、kAudioSessionProperty_-
CurrentHardwareOutputVolume、kAudioSessionProperty_-
CurrentHardwareOutputLatency、kAudioSessionProperty_-
AudioInputAvailable,这些属性改变时候都会有事件,可以自定义callback函数处理
处理音乐和视频
ipod音乐:MPMusicPlayerController类,是系统默认的一个audio session
视频:MPMoviePlayerController类,是系统默认的一个audio session,但是要设置useApplicationAudioSession为NO。
它们都需要配置audio session
Configuring audio sessions when using a movie player
附件是sample code