1.音频会话
简单的理解,音频会话就是音频功能的抽象类,封装了音频的模式和一些功能.
1.1音频会话
AVAudioSessionCategoryAmbient : 游戏,效率应用程序 (混音模式,只能输出音频)
AVAudioSessionCategorySoloAmbient : 默认模式,游戏,效率应用程序(不能混音,只能输出音频)
AVAudioSessionCategoryPlayback : 音视频播放(可以选择是否混音,只能输出音频)
AVAudioSessionCategoryRecord : 录音(不能混音,只能输入音频)
AVAudioSessionCategoryPlayAndRecord : 语音聊天(可以选择是否混音,可以输入和输出音频)
AVAudioSessionCategoryAudioProcessing : 离线会话和处理(没有混音,不能输入输出音频)
AVAudioSessionCategoryMultiRoute : 外部硬件(不能混音,可以输入输出音频)
根据应用程序的功能,去选择音频会话的模式,另外一些模式下还有可选的options和modes来进一步满足需求.
配置音频会话
AVAudioSession * session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
2 AVAudioPlayer
AVAudioPlayer只能播放本地音频,通过文件url或者音频NSData创建播放器示例.
NSURL *fileUrl = [[NSBundle mainBundle]URLForResource:@"audio" withExtension:@"mp3"];
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];
[player prepareToPlay];
[player prepareToPlay];是预备播放,把音频加载到缓冲器,可以减小播放的延迟.
[player play];
[player pause];
[player stop];
play即播放,pause和stop都会暂停播放,不过stop会撤销prepareToPlay时做的设置.
音量 volume 音量是从0.0到1.0
pan值 pan值是立体声效果,从-1.0(左)到1.0(右),默认是0.0(居中)
倍速 首先需要在prepareToPlay之前设置enableRate为YES.之后修改rate才会起效,范围是0.5到2.0,这个倍速不会改变音调.
循环 numberOfLoops 设置n为循环n次,-1位无限循环
音频计量可以获取音频的音量力度的平均值和峰值
2.1 处理中断事件
AVAudioPlayer播放音频时,电话呼入,闹钟响起等都会中断音频播放,但是在这之后,音频不会自动恢复,需要代码来实现
音频会话会在中断事件时发送通知(AVAudioSessionInterruptionNotification). 在通知的userInfo字典中,有一个key(AVAudioSessionInterruptionTypeKey)对应的枚举值(AVAudioSessionInterruptionType)是中断事件的类型,只有两种,开始和结束.
并且如果是结束中断的通知,userInfo还有一个AVAudioSessionInterruptionOptions的值来表明是否可以继续播放音频.
2.2 处理线路改变
当输出线路改变时,比如切换耳机,外置麦克风等设备,音频会话会发送一个通知(AVAudioSessionRouteChangeNotification),userInfo中包含了前一个线路的信息,AVAudioSessionRouteChangeReasonKey对应的值描述了线路变化的原因,其中耳机断开包含在类型AVAudioSessionRouteChangeReasonOldDeviceUnavailable中
仅仅判断类型是OldDeviceUnavailable是不够的,userInfo中有一个AVAudioSessionRouteChangePreviousRouteKey,代码示例如下
AVAudioSessionRouteDescription *desc = info[AVAudioSessionRouteChangePreviousRouteKey];
AVAudioSessionPortDescription *outPut = desc.outputs.firstObject;
NSString *type = outPut.portType;
portType是字符串,有很多种,其中AVAudioSessionPortHeadphones是耳机.
3 录制音频
需要一个用来存储的路径, 一个配置信息字典
NSDictionary *settings = @{AVFormatIDKey:@(kAudioFormatMPEG4AAC),AVSampleRateKey:@22050.0f,AVNumberOfChannelsKey:@1,AVEncoderBitDepthHintKey:@16,AVEncoderAudioQualityKey:@(AVAudioQualityMedium)};
AVAudioRecorder * recoder = [[AVAudioRecorder alloc]initWithURL:[NSURL URLWithString:@""] settings:settings error:nil];
[recoder record];
[recoder pause];
[recoder stop];
**3.1 音频格式AVFormatIDKey
不同的格式需要对应不同的扩展名,最常用的是kAudioFormatMPEG4AAC的".aac"格式,另外caf扩展名可以存储所以音频格式
**3.2 采样率AVSampleRateKey
采样率建议使用标准采样率,8000,16000,22050,44100.采样率越高,音频质量越高,文件越大.
**3.3通道数AVNumberOfChannelsKey
1是单声道,2是立体声
**3.4位深AVEncoderBitDepthHintKey
位深和采样率一样影响音频的质量,单位是dB,常用有8,16,24,32
**3.5质量AVEncoderAudioQualityKey
4.测量音频
[recoder updateMeters];
[recoder averagePowerForChannel:0];
[recoder peakPowerForChannel:0];
音频的分贝是从-160dB到0dB,每当要获取分贝值时,首先需要调用[recoder updateMeters];,然后averagePowerForChannel获取平均值,peakPowerForChannel获取峰值,其中0是声道,单声道时,0就是唯一的声道.