AVFoundation-录音

录音

0. 应用场景

    语音聊天:大多数应用在即时通讯APP中, 语音发送
    语音备忘录:录一段音频, 来记录某件事情

1. 录音步骤

  1. 导入AVFoundation框架

        // OC
        #import 
    
        // swift
        import AVFoundation
    
  2. 使用类AVAudioRecorder进行录音

    1. objc
    // 1. 创建录音文件存放路径
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"text.caf"];
        NSURL *url = [NSURL URLWithString:path];
    
    // 2. 设置录音附加设置项(#import ),固定配置
          NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        // 设置编码格式
        [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey];
        // 采样率
        [recordSettings setValue :[NSNumber numberWithFloat:11025.0] forKey: AVSampleRateKey];//44100.0
        // 通道数
        [recordSettings setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey];
        //音频质量,采样质量
        [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
    
    // 3. 根据路径以及设置项, 创建录音对象
        _audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:nil];
    
    // 4. 准备录音
        [self.audioRecorder prepareToRecord];
    
    // 5. 开始录音
         [self.audioRecorder record];
    
    // 6. 停止录音
        [self.audioRecorder stop];
    
    1. swift
    var record: AVAudioRecorder?
    
    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
    
        // 开始录音
        // 1.1 创建路径
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first)!
    
        let filePath = path + "/test.caf"
        print(filePath)
        let fileURL = NSURL(string: filePath)!
    
        // 1.2 创建一个录音配置字典
        // 录音参数设置(不需要掌握, 一些固定的配置)
        // 这个配置, 可以保证, 音质比较好的情况下, 大小也适中
        let configDic: [String: AnyObject] = [
            // 编码格式
            AVFormatIDKey: NSNumber(int: Int32(kAudioFormatLinearPCM)),
            // 采样率
            AVSampleRateKey: NSNumber(float: 11025.0),
            // 通道数
            AVNumberOfChannelsKey: NSNumber(int: 2),
            // 录音质量
            AVEncoderAudioQualityKey: NSNumber(int: Int32(AVAudioQuality.Min.rawValue))
        ]
    
        do {
        // 1.3 创建录音对象
            record = try AVAudioRecorder(URL: fileURL, settings: configDic)
        }catch {
            print(error)
            return
        }
    
        // 2. 准备录音
        record?.prepareToRecord()
    
        // 3. 开始录音
        record?.record()
    
        // 从设置的时间点,开始录音
    //      record?.recordAtTime((record?.deviceCurrentTime)! + 2)
        // 从后面的某个时间点, 录音多久
    //      record?.recordAtTime((record?.deviceCurrentTime)! + 2, forDuration: 3)
        // 从当前时刻开始录音, 录音多久
    //        record?.recordForDuration(2)
    }
    
    override func touchesEnded(touches: Set, withEvent event: UIEvent?) {
    
        // 获取当前的录音时间(长度, 录音多久了)
        let duration = record?.currentTime ?? 0
    
        if duration < 2 {
            print("录音时间太短, 清重新录音")
    
            // 删除当前录音的文件
            // 删除文件, 一定要保证, 录音停止
            record?.stop()
            record?.deleteRecording()
            return
        }
    
        print("录音时间刚刚好,可以保存")
        record?.stop()
    
        // 可参考本文第5点通过lame转音频文件转码
    }
    
  3. 概念补充
    1. 编码概念:编码是信息从一种形式转换为另一种形式的过程
    2. 编码格式
    > AAC: AAC其实是“高级音频编码(advanced audio coding)”的缩写,它是被设计用来取代MP3格式的。
    > HE-AAC: HE-AAC是AAC的一个超集,这个“HE”代表的是“High efficiency”。 HE-AAC是专门为低比特率所优化的一种音频编码格式
    > AMR: AMR全称是“Adaptive Multi-Rate”,它也是另一个专门为“说话(speech)”所优化的编码格式,也是适合低比特率环境下采用
    > ALAC: 它全称是“Apple Lossless”,这是一种没有任何质量损失的音频编码方式,也就是我们说的无损压缩
    > IMA4: 这是一个在16-bit音频文件下按照4:1的压缩比来进行压缩的格式。
    > MP3
    > LPCM : 即线性脉冲编码调制,是一种非压缩音频数字化技术,是一种未压缩的原音重现;数字模式下, 音频的初始信号是PCM

         > 参考资料地址
         http://baike.baidu.com/link?url=z36Nw7UihAEnCC6BjCygft9rBpLr29Ru0of_9Blpl0aR6qzI1B9iWTD5h3uimPVix2SuuQYo7GVYOIsaaP2Eyq
    
     3. 文件格式(不同的文件格式, 可保存不同的编码格式)
         > WAV :
             特点: 音质最好的格式, 对应PCM编码
             适用: 多媒体开发、保存音乐和音效素材。
    
         > MP3 :
             特点: 音质好,压缩比比较高,被大量软件和硬件支持
             适用: 适合用于比较高要求的音乐欣赏。
    
         > caf :
             特点: 适用于几乎iOS中所有的编码格式
    
  4. 开发经验
    1. caf 文件格式, 因为某些编码设置, 文件有可能会很大, 而且caf, 格式并不是很通用, 所以在开发过程中, 一般会进行压缩转码, MP3;

  5. 使用lame静态库转码

    • iOS 通过(lame)将录制音频转换成Mp3
      1. LAME是一个开源的MP3音频压缩软件。LAME是一个递归缩写,来自LAME Ain't an MP3 Encoder(LAME不是MP3编码器)。它自1998年以来由一个开源社区开发,目前是公认有损品质MP3中压缩效果最好的编码器。
      2. 步骤:
      第一步: 下载lame的最新版本并解压:http://sourceforge.net/projects/lame/files/lame/3.99/
      第二步:生成静态库
      1. 下载build的脚本:https://github.com/kewlbear/lame-ios-build
      2. 提升权限:命令行中输入sudo -s
      3. 修改脚本权限(所有人有可执行权限):chmod a+x 脚本名称
      4. 执行脚本:./脚本名称
      5. 注意: 如果最终没有生成静态库:
      1. 先检查XCode应用名称是否是XCode(后面不要加2, 3 之类的东西)
      2. commod + , 把命令行工具选中
      第三步:导入静态库到工程, 开始使用,最好封装成一个分类,提供一个转码的方法
  6. 录音其他使用

  7. 录音详解

你可能感兴趣的:(AVFoundation-录音)