AVFoundation-录音

录音

0. 应用场景

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

1. 录音步骤

  1. 导入AVFoundation框架

        // OC
        #import <AVFoundation/AVFoundation.h>
    
        // 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 <AVFoundation/AVAudioSettings.h>),固定配置
          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<UITouch>, 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<UITouch>, 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. 录音详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • 1. 导入录音功能依赖的框架 2. 在相应界面引入头文件 然后遵守协议AVAudioRecorderDelegat...
    黑白灰的绿i阅读 6,457评论 6 13
  • 需要使用AVFoundatiaon框架 创建录音对象 根据需求, 进行录音/暂停/停止3.1开始录音 3.2暂停录...
    e85a0a8a9ba4阅读 827评论 0 4
  • 1.界面布局,以及相关功能 点击中间开始录音,点击左上角播放或暂停播放,点击右上角移除文件 2.定义相关属性 #i...
    大雨可洗头阅读 5,280评论 4 5
  • 简介 简单来说,音频可以分为2种 音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果...
    JonesCxy阅读 918评论 1 2
  • 雷声渐渐响起,女孩走在马路边。一辆车向她这冲过来,女孩没有躲开,脸上没有丝毫恐惧。"慕依依,你不是疯了。"女...
    筱千瑶阅读 580评论 1 0