使用System Sound Service播放音效
参考 http://www.cnblogs.com/kenshincui/p/4186022.html
步骤
- 调用
AudioServicesCreateSystemSoundID( CFURLRef inFileURL, SystemSoundID* outSystemSoundID)
函数获得系统声音ID。 - 如果需要监听播放完成操作,则使用
AudioServicesAddSystemSoundCompletion( SystemSoundID inSystemSoundID, CFRunLoopRef inRunLoop, CFStringRef inRunLoopMode, AudioServicesSystemSoundCompletionProc inCompletionRoutine, void* inClientData)
方法注册回调函数。 - 调用
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
或者AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
方法播放音效(后者带有震动效果)。
示例:
1 |
|
AVAudioPlayer播放音频
AVAudioPlayer 简介
创建
一般通过 使用本地音频文件的 NSURL 或者包含音频的内存的 NSData。
1 | - (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError; |
使用 prepareToPlay 方法 可以取得需要的音频硬件并预加载 Audio Queue 的缓冲区。在创建的时候调用可以降低调用 play 方法和听到声音输出之间的延迟。
对播放进行控制
常见的
play
、stop
和pause
的播放暂停功能。
其中 stop 和 pause 的区别是 stop 方法会撤销调用 prepareToPlay时所做的设置,而 pause 方法不会。
除此之外还有:
- 修改播放器的音量 (volume):从0.0(静音)到1.0(最大音量之间)。
- 修改播放器的 pan 值:允许使用立体声播放声音,从 -1.0(极左)到 1.0(极右)。默认 0.0(居中)。
- 调整播放率 (rate):需要配合 enableRate 使用。范围从 0.5(半数)到2.0(2倍数)。
- 无缝循环 (numberOfLoops): 播放 n+1次,若 n<-1 则播放无限次直到被停止。
- 音频计量: 可以读取音量力度的平均值和峰值。
配置音频会话,后台播放
默认会话类型为 AVAudioSessionCategorySoloAmbient
这个类型不能后台播放
添加后台播放 -设置会话:
1 | AVAudioSession *session = [AVAudioSession sharedInstance]; |
添加后台播放 -修改info.plist :
设置后台运行模式:在plist文件中添加Required background modes,并且设置item 0=App plays audio or streams audio/video using AirPlay(其实可以直接通过Xcode在Project Targets-Capabilities-Background Modes中设置)
处理中断
使用设备的过程中,经常会出现电话呼入等情况,默认情况下,中断发生时音频会慢慢消失暂停,但是当中断结束时,音频不会自动开始。
接收中断事件,并作出处理
1 | //接收中断 |
对线路改变的响应
默认情况下,播放音频时插入耳机,音频输出变为耳机并播放;断开耳机时,音频输出变为扬声器并播放。 希望改为断开耳机的时候停止播放
接收线路变化通知,并作出处理
1 | //注册通知 |
AVAudioRecorder 录制音频
初始化
1 | - (nullable instancetype)initWithURL:(NSURL *)url settings:(NSDictionary<NSString *, id> *)settings error:(NSError **)outError; |
参数分别表示
- url,用于表示音频流写入文件的本地文件URL
- setting,包含录音会话键值信息的NSDictionary对象
- AVFormatIDKey:写入的音频格式
- AVSampleRateKey:采样率 。一般使用8000、16000、22050或44100
- AVNumberOfChannelsKey:通道数,1为单声道,2表示立体声
- outError,捕捉初始化阶段各种错误的NSError指针
例子:
1 | NSString *tmpDir = NSTemporaryDirectory(); |
配置音频会话
默认AVAudioSessionCategorySoloAmbient 不支持音频输入,改为AVAudioSessionCategoryPlayAndRecord
对录制进行控制
- 录制暂停停止:record,pause,stop;
- 恢复录制:pause之后调用record,AVAudioSession会帮你记录上次录音的地方并追加录音
- 获取时间:currentTime录制时长(秒),不能使用kvo监测
Audio Metering测量音频
AVAudioRecoder 和 AVAudioPlayer 可以对音频进行测量。Audio Metering可以让开发者读取音频的平均分贝和峰值分贝
获取音频分贝数据
- 设置录音器的 meteringEnabled属性为true
- 每次获取的时候 调用 updateMeters 方法获取最新的值
- (float)peakPowerForChannel:(NSUInteger)channelNumber;
获取峰值分贝(对数形式的 -160 到 0)- (float)averagePowerForChannel:(NSUInteger)channelNumber;
获取平均分贝(对数形式的 -160 到 0)