美文网首页音视频
iOS AVFoundation 系列一 (AVAudioRec

iOS AVFoundation 系列一 (AVAudioRec

作者: allenzhan | 来源:发表于2019-10-22 09:19 被阅读0次

    使用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 系列一 (AVAudioRec

        本文链接:https://www.haomeiwen.com/subject/wbyiuctx.html