在iOS开发中,音视频最重要的framework就是AVFoundation Framework了。从本文开始,主要谈基于AVFoundation的音频使用与处理。要掌握音频的使用,首先要了解的就是Audio Session了。
1、什么是Audio Session?
先给出官方的英文解释:
An audio session is the intermediary between your application and iOS for configuring audio behavior. Upon launch, your application automatically gets a singleton audio session. You configure it to express your application’s audio intentions.
我的理解就是一个应用最基本的音频配置,来设置基本的应用与系统之间的音频处理方式,比如:
1)应用里的音频播放时是否要和其他应用的音频实现混音?或者让其他音频静音?
2)当iOS的闹钟响时应用内的音频是否要暂停?
3)当用户插拔耳机时应用应该如何反应?拔出耳机时是否要停止音乐?
4)关闭屏幕后音频是否暂停?
以上这些问题就是Audio Session要设置的东西。可以说要使用AVFoundation播放音乐,第一步就是要设置Audio Session,它影响应用内所以相关音频的播放方式。
2、Audio Session的设置实践
1)设置的根本方式:更改Audio Session的Category类别。
一个Audio Session Category就是一个Key,来描述应用音频处理方式的一个种类。通过设置Audio Session 不同的Category来更改配置。
总体上,Category有以下4类:
(1)是否允许混音
(2)打开静音和关闭屏幕时是否要静音
(3)是否支持音频输入,比如要录制音频
(4)是否支持音频输出,比如要播放音频
2)默认的Audio Session是怎样的?
如果你的应用正好符号Audio Session的默认设置,那么你也就不用特地来设置它了。默认的Audio Session具有如下设置:
(1)允许播放Playback不允许录制;
(2)当用户打开静音时,就是设备侧边的那个静音开关,那么应用内正在播放的音频将静音;
(3)当用户锁定屏幕或屏幕自动变暗时,应用内的应用内正在播放的音频将静音;
(4)当你应用内的音频开始时,如果这个时候有其他应用比如iPod正在播放音乐,那么iPod将暂停播放。
以上这一系列方式已经被打包成一个类别,就是AVAudioSessionCategorySoloAmbient,默认的类别
3)Audio Session不起作用的情况
两种:
(1)应用内根本不使用音频。(这不是白说吗?)
(2)应用使用System Sound Services 或者UIKit 的playInputClick。
前一种在上一篇文章中有说,后一种就是设置点击键盘的键盘音。
4)开始设置Audio Session(前提:在Xcode中加入AVFoundation.framework
(1)获取Audio Session对象
AVAudioSession *session = [AVAudioSession sharedInstance];
(2)基本设置
使用setCategory:error:或setCategory:option:error: 方法来实现
比如:
[session setCategory:kAudioSessionCategoryPlayback error:nil];
(3)Category介绍
// 下面这个类别用于音频比较次要的应用,应用的音频会和其他应用的音频实现混音
// 然后关闭屏幕或者静音开关打开时音频将静音。
NSString *const AVAudioSessionCategoryAmbient;
// 默认类别
NSString *const AVAudioSessionCategorySoloAmbient;
// 下面这个类别应用侧重音频播放,使用这个类别时,关闭屏幕或静音开关打开
// 时音频将继续播放,与其他应用音频不混音。要使应用能后台继续需要相关设置。
NSString *const AVAudioSessionCategoryPlayback;
// 下面这个类别应用将侧重录音。将使播放的音频静音,屏幕关闭时录制音频将继续。
// 要使应用能后台继续需要相关设置。
NSString *const AVAudioSessionCategoryRecord;
// 下面这个类别应用允许音频播放和录制,比如用于VOIP语音通话应用。播放和录音
// 可以同时进行,关闭屏幕将可以继续。要使应用能后台继续需要相关设置。
NSString *const AVAudioSessionCategoryPlayAndRecord;
// 下面这个类别用于音频处理,详细见开发文档
NSString *const AVAudioSessionCategoryAudioProcessing;
// 下面这个类别可以实现同时多个输出,详细见开发文档
NSString *const AVAudioSessionCategoryMultiRoute;
4、总结
以上只是Audio Session最基本的设置,在开发文档中可以看到还有很多设置的内容。如果要开发高级的音频应用,可以再去看开发文档。