iOS AVFoundation 系列一 (AVAudioRec
2019-10-22 本文已影响0人
allenzhan
使用AVAudioRecorder
录制音频
一、创建AVAudioRecorder
创建AVAudioRecorder
实例需要提供一些信息,分别是
- 用于表示音频流写入的本地文件 URL
- 用于配置录音会话键值信息的NSDictonary 对象
- 用于捕获初始化阶段的各种错误的NSError 指针
下面看下初始化代码
- (AVAudioRecorder *)recorder{
if (!_recorder) {
//1.设置r录音存放的位置
NSURL *url = [NSURL fileURLWithPath:self.recorderFileStr];
//2. 设置录音参数
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
//设置编码格式
/**
kAudioFormatLinearPCM: 无损压缩,内容非常大
*/
[settings setValue:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
//设置采样率 必须保证和转码设置的相同
[settings setValue:@(22050.0) forKey:AVSampleRateKey];
//通道数
[settings setValue:@(1) forKey:AVNumberOfChannelsKey];
//音频质量,采样质量(音频质量越高,文件的大小也就越大)
[settings setValue:@(AVAudioQualityMin) forKey:AVEncoderAudioQualityKey];
_recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];
_recorder.meteringEnabled = YES;
}
return _recorder;
}
下面解释一下上面用到的一些参数
-
音频格式
AVFormatIDKey
kAudioFormatLinearPCM
kAudioFormatAppleIMA4
kAudioFormatMPEG4AAC
指定
kAudioFormatLinearPCM
会将未压缩的音频流写入到文件 中。这种格式的保真度最好,但是文件也会很大,选择kAudioFormatAppleIMA4
、kAudioFormatMPEG4AAC
会缩小文件大小,还能保证高质量的音频内容
注意:
你指定的音频格式一定要和你URL 定义的文件类型兼容,不然录制会失败。
如保存的文件名为`xxx.wav`则`AVFormatIDKey `要指定`kAudioFormatLinearPCM `
-
采样率
AVSampleRateKey
AVSampleRateKey
用于定义录音器的采样率。采样率定义了对输入的模拟信号每一秒内的采样数。对于是么采样率最好没有明确的定义,但是尽量采用一些标准的采样率 如:8000
、16000
、22050
、44100
采样率越高文件大小越大 -
通道数
AVNumberOfChannelsKey
AVNumberOfChannelsKey
用于定义记录音频内容的通道数。默认是1
,是使用单声道去录制的,设置为2
的话是使用立体声去录制,除非使用外部硬件录制,不然一般都设置为单声道录制
二、配置音频会话 AVAudioSession
-
音频会话分类
AVFoundation 定义了7中分类来描述应用程序所使用的的音频行为
image.png
*音频会话设置
/**
AVAudioSessionCategoryPlayAndRecord: 可以边播放边录音(也就是平时看到的背景音乐)
*/
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//启动会话
[[AVAudioSession sharedInstance] setActive:YES error:nil];
三、简单的录音功能的实现
YMAudioRecordTool.h
/**开始录音*/
- (void)startRecordWithAudioRecordPath:(NSString *)recordPath;
/**结束录音*/
- (void)stopRecord;
/**播放录音*/
- (void)playRecordFile;
/**停止播放*/
- (void)stopPlaying;
/**删除录音文件*/
- (void)deleteRecordFile;
YMAudioRecordTool.m
@interface YMAudioRecordTool ()
@property (nonatomic, strong) AVAudioRecorder *recorder;
@property (nonatomic, copy) NSString *recorderFileStr;
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@end
@implementation YMAudioRecordTool
/**开始录音*/
- (void)startRecordWithAudioRecordPath:(NSString *)recordPath{
if (!recordPath) {
return ;
}
self.recorderFileStr = recordPath;
// 准备录音
[self.recorder prepareToRecord];
// 开始录音
[self.recorder record];
}
/**结束录音*/
- (void)stopRecord{
[self.recorder stop];
}
/**播放录音*/
- (void)playRecordFile{
[self.recorder stop];
if ([self.audioPlayer isPlaying]) return;
[_audioPlayer prepareToPlay];
[_audioPlayer play];
}
/**停止播放*/
- (void)stopPlaying{
[_audioPlayer stop];
}
/**删除录音文件*/
- (void)deleteRecordFile{
[self.recorder stop];
[self.recorder deleteRecording];
}
#pragma mark — lazyload
- (AVAudioRecorder *)recorder{
if (!_recorder) {
// 0. 设置录音会话
/**
AVAudioSessionCategoryPlayAndRecord: 可以边播放边录音(也就是平时看到的背景音乐)
*/
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//启动会话
[[AVAudioSession sharedInstance] setActive:YES error:nil];
//1.设置r录音存放的位置
NSURL *url = [NSURL fileURLWithPath:self.recorderFileStr];
//2. 设置录音参数
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
//设置编码格式
/**
kAudioFormatLinearPCM: 无损压缩,内容非常大
*/
[settings setValue:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
//设置采样率 必须保证和转码设置的相同
[settings setValue:@(44100.0) forKey:AVSampleRateKey];
//通道数
[settings setValue:@(1) forKey:AVNumberOfChannelsKey];
//音频质量,采样质量(音频质量越高,文件的大小也就越大)
[settings setValue:@(AVAudioQualityMin) forKey:AVEncoderAudioQualityKey];
_recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];
_recorder.meteringEnabled = YES;
}
return _recorder;
}
- (AVAudioPlayer *)audioPlayer{
if (!_audioPlayer) {
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:self.recorderFileStr] error:nil];
}
return _audioPlayer;
}