iOS中支持的音频播放类型
播放音效System Sound Service
播放本地音频AVFoundataion
播放流媒体音频Audio Queue Service
简单来说,音频可以分为2种
音效
又称短音频
,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验
音乐
比如游戏中的背景音乐,一般播放时间较长
1.音效的播放
音效
又称短音频
,是一个声音文件
,在应用程序中起到点缀效果
,用于提升应用程序的整体用户体验
通常短音效在程序中的播放时长为1~2秒
,对于某些特殊动画效果的点缀音效可以略长
由于音效的播放相对比较频繁
,为了不影响应用程序的性能
,在实际应用中通常使用非压缩的音频格式(AIFF)或者CAF音频格式
,从而减低系统在音频解码上的消耗
,达到省电
的目的
使用系统声音服务播放音效
,需要导入AudioToolbox框架
系统声音服务通过SystemSoundID
来播放声音文件,对于同一个声音文件,可以创建多个SystemSoundID
系统声音服务是一套C语言的框架
为了提高应用程序性能,避免声音文件被重复加载,通常采用单例模式处理系统声音的播放
// 1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
// 2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
// 3.播放音效
AudioServicesPlaySystemSound(soundID);
音效文件只需要加载1次
音效播放常见函数总结
加载音效文件
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效同时振动(当用户静音时,可以通过振动提示用户注意重要操作)
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
注意:硬件解码器一次只能对一个音频文件解码。在实际应用中通常使用非压缩的音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的消耗,达到省电的目的
2.音频转换工具
转换aiff格式
afconvert -f AIFF -d I8 filename
转换caf格式
afconvert -f caff -d aac -b 32000 filename
批量转换
find . -name '*.mp3' -exec afconvert -f caff -d aac -b 32000 {} \;
3.音乐的播放 AVAudioPlayer
使用AVAudioPlayer可以播放本地音乐,具备以下特点:
能够预先缓存,提高播放的流畅性prepareToPlay
播放起始时间playAtTime
播放控制play/pause/stop
循环播放次数numberOfLoops
播放音量volume
设置播放速度enableRate/rate
音量监控meteringEnabled/peakPowerForChannel/averagePowerForChannel
还可以通过AVAudioPlayer的代理方法
监控音乐的播放进度
是否正在播放
@property(readonly, getter=isPlaying) BOOL playing;
时长
@property(readonly) NSTimeInterval duration;
当前的播放位置
@property(readonly) NSTimeInterval currentTime;
播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次)
@property NSInteger numberOfLoops;
音量
@property float volume;
是否允许更改速率
@property BOOL enableRate;
播放速率(1是正常速率,0.5是一般速率,2是双倍速率)
@property float rate;
有多少个声道
@property(readonly) NSUInteger numberOfChannels;
加载音乐文件
- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (id)initWithData:(NSData *)data error:(NSError **)outError;
准备播放(缓冲,提高播放的流畅性)
- (BOOL)prepareToPlay;
播放(异步播放)
- (BOOL)play;
暂停
- (void)pause;
停止
- (void)stop;
3.AVAudioSession单例
AVAudioSession是一个单例
,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用
针对不同的音频应用场景,需要设置不同的音频会话分类
AVAudioSessionCategoryAmbient
混音播放,例如雨声、汽车引擎等,可与其他音乐一起播放
AVAudioSessionCategorySoloAmbient
后台播放,其他音乐将被停止
AVAudioSessionCategoryPlayback
独占音乐播放
AVAudioSessionCategoryRecord
录制音频
AVAudioSessionCategoryPlayAndRecord
播放和录制音频
AVAudioSessionCategoryAudioProcessing
使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音
后台播放音乐——设置后台任务
+ (UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId
{
// 1. 设置并激活音频会话类别
AVAudioSession *session = [AVAudioSession sharedInstance];
[session AVAudioSessionCategoryPlayback error:nil];
[session setActive:YES error:nil];
// 2. 允许应用程序接收远程控制
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
// 3. 设置后台任务ID
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
if (newTaskId != UIBackgroundTaskInvalid && backTaskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:backTaskId];
}
return newTaskId;
}
// 后台播放任务Id
UIBackgroundTaskIdentifier _bgTaskId;
// 设置音频会话,允许后台播放
_bgTaskId = [SoundTool backgroundPlayerID:_bgTaskId];
4.录音
音频录音机参数字典
NSMutableDictionary *setting = [[NSMutableDictionary alloc] init];
// 音频格式
[setting setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
// 音频采样率
[setting setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
// 音频通道数
[setting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
// 线性音频的位深度
[setting setValue:[NSNumber numberWithInt:8]for Key:AVLinearPCMBitDepthKey];
return setting;
5.音频队列服务
在iOS
和Mac OS X
中,音频队列服务
提供了一种直接、低开销
的方式来录制
和播放音频
。也是苹果公司推荐
在iOS和Mac OS X程序中添加录制和播放功能使用的技术
音频队列服务允许录制和播放以下格式的音频:
线性PCM(Linear PCM)
任何苹果平台原生支持的压缩格式
任何用户已经安装相应编码器的其他格式
音频队列服务是纯C接口
的
音频队列的架构
所有的音频队列都含有相同的基础结构,其中包含:
一组音频队列缓冲区(audio queue buffers
),每个音频队列缓冲区都是一个存储音频数据的临时仓库,通常是3个
一个缓冲区队列(buffer queue
),音频队列缓冲区的有序列表
一个自己编写的音频队列回调函数(audio queue callback
)
在录制音频时:回调函数负责将缓冲区中的数据写入磁盘
在播放音频时:回调函数负责从磁盘加载音频数据到缓冲区