0%

使用AVAudioRecorder录制音频

与使用AVAudioPlayer一样,AVAudioRecorder提供了功能强大而且简单易用的接口来实现音频的录制功能.

1.创建AVAudioRecorder

创建AVAudioRecorder实例时需要为其提供一些数据信息,如下:

  • 用于表示音频流写入文件的本地文件URL
  • 包含用于配置录音会话键值信息的NSDictionary对象
  • 用于捕捉初始化阶段错误的NSError指针

上述条件具体的设置代码参考如下:

NSString *tmpDir = NSTemporaryDirectory();
NSString *filePath = [tmpDir stringByAppendingPathComponent:@"memo.caf"];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];

NSDictionary *settings = @{
                   AVFormatIDKey : @(kAudioFormatAppleIMA4),
                   AVSampleRateKey : @44100.0f,
                   AVNumberOfChannelsKey : @1,
                   AVEncoderBitDepthHintKey : @16,
                   AVEncoderAudioQualityKey : @(AVAudioQualityMedium)
                   };

NSError *error;
self.recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:&error];
if (self.recorder) {
    self.recorder.delegate = self;
    self.recorder.meteringEnabled = YES;
    [self.recorder prepareToRecord];
} else {
    NSLog(@"Error: %@", [error localizedDescription]);
}

为成功创建AVAudioRecorder实例,建议调用其prepareToRecord方法.这个方法执行底层Audio Queue初始化的必要过程.该方法还在URL参数指定的位置创建一个文件,将录制启动时的延时降到最小.

配置录音会话键值的完整可用键信息在<AVFoundation/AVAudioSettings.h>中定义.大部分的键都专门定义了特有的格式,下面将介绍一些通用的音频格式.

1.1音频格式

AVFormatIDKey键定义了写入内容的音频格式,下面的常量都是音频格式所支持的值:

  • kAudioFormatLinearPCM
  • kAudioFormatMPEG4AAC
  • kAudioFormatAppleLossless
  • kAudioFormatAppleMA4
  • kAudioFormatiLBC
  • kAudioFormatULaw

指定kAudioFormatLinearPCM会将未压缩的音频流写入到文件中.这种格式保真度最高,不过相应的文件也最大.选择诸如kAudioFormatMPEG4AAC或者kAudioFormatAppleMA4的压缩格式会显著缩小文件,也能保证高质量的音频内容.

注意,指定的音频格式一定要和URL参数定义的文件类型一致.否则会返回错误信息.

1.2采样率

AVSampleRateKey用于定义录音的采样率.采样率定义了对输入的模拟音频信号每一秒内的采样数.采样率会直接影响录音的质量以及最终文件的大小.对于使用什么样的采样率最优没有明确的定义,不过开发者应该尽量使用标准的采样率,比如8K,16K,22050或44100.

1.3通道数

AVNumberOfChannelKey用于定义记录音频内容的通道数.指定默认值1表示使用单声道录制,设置为2便是使用立体声录制.除非使用外部硬件,否则通常应当创建单声道录音.

1.4指定格式的键

处理Linear PCM或压缩音频格式时,可以定义一些其他指定格式的键.可以在Xcode的帮助文档AV Foundation Audio Settings Constants中找到完整的列表.

2.控制录音过程

创建了一个可用的录音器实例后,就可以开始录音了.AVAudioRecorder包含一些方法可以支持无限时长的录制,比如在未来某一时间点开始录制,或者录制指定时长的内容等.开发者设置可以暂停录制并在之后从停止点继续重启录制.