iOS AVFoundation 系列一 (AVAudioRecorder)

使用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会将未压缩的音频流写入到文件 中。这种格式的保真度最好,但是文件也会很大,选择kAudioFormatAppleIMA4kAudioFormatMPEG4AAC会缩小文件大小,还能保证高质量的音频内容

注意:
你指定的音频格式一定要和你URL 定义的文件类型兼容,不然录制会失败。
如保存的文件名为`xxx.wav`则`AVFormatIDKey `要指定`kAudioFormatLinearPCM `

  • 采样率 AVSampleRateKey
    AVSampleRateKey用于定义录音器的采样率。采样率定义了对输入的模拟信号每一秒内的采样数。对于是么采样率最好没有明确的定义,但是尽量采用一些标准的采样率 如:8000160002205044100 采样率越高文件大小越大

  • 通道数 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;
}

你可能感兴趣的:(iOS AVFoundation 系列一 (AVAudioRecorder))