AVFoundation-錄音

錄音

0. 應(yīng)用場景

    語音聊天:大多數(shù)應(yīng)用在即時通訊APP中, 語音發(fā)送
    語音備忘錄:錄一段音頻, 來記錄某件事情

1. 錄音步驟

  1. 導(dǎo)入AVFoundation框架

        // OC
        #import <AVFoundation/AVFoundation.h>
    
        // swift
        import AVFoundation
    
  2. 使用類AVAudioRecorder進(jìn)行錄音

    1. objc
    // 1. 創(chuàng)建錄音文件存放路徑
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"text.caf"];
        NSURL *url = [NSURL URLWithString:path];
    
    // 2. 設(shè)置錄音附加設(shè)置項(xiàng)(#import <AVFoundation/AVAudioSettings.h>),固定配置
          NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        // 設(shè)置編碼格式
        [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey];
        // 采樣率
        [recordSettings setValue :[NSNumber numberWithFloat:11025.0] forKey: AVSampleRateKey];//44100.0
        // 通道數(shù)
        [recordSettings setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey];
        //音頻質(zhì)量,采樣質(zhì)量
        [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
    
    // 3. 根據(jù)路徑以及設(shè)置項(xiàng), 創(chuàng)建錄音對象
        _audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:nil];
    
    // 4. 準(zhǔn)備錄音
        [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 創(chuàng)建路徑
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first)!
    
        let filePath = path + "/test.caf"
        print(filePath)
        let fileURL = NSURL(string: filePath)!
    
        // 1.2 創(chuàng)建一個錄音配置字典
        // 錄音參數(shù)設(shè)置(不需要掌握, 一些固定的配置)
        // 這個配置, 可以保證, 音質(zhì)比較好的情況下, 大小也適中
        let configDic: [String: AnyObject] = [
            // 編碼格式
            AVFormatIDKey: NSNumber(int: Int32(kAudioFormatLinearPCM)),
            // 采樣率
            AVSampleRateKey: NSNumber(float: 11025.0),
            // 通道數(shù)
            AVNumberOfChannelsKey: NSNumber(int: 2),
            // 錄音質(zhì)量
            AVEncoderAudioQualityKey: NSNumber(int: Int32(AVAudioQuality.Min.rawValue))
        ]
    
        do {
        // 1.3 創(chuàng)建錄音對象
            record = try AVAudioRecorder(URL: fileURL, settings: configDic)
        }catch {
            print(error)
            return
        }
    
        // 2. 準(zhǔn)備錄音
        record?.prepareToRecord()
    
        // 3. 開始錄音
        record?.record()
    
        // 從設(shè)置的時間點(diǎn),開始錄音
    //      record?.recordAtTime((record?.deviceCurrentTime)! + 2)
        // 從后面的某個時間點(diǎn), 錄音多久
    //      record?.recordAtTime((record?.deviceCurrentTime)! + 2, forDuration: 3)
        // 從當(dāng)前時刻開始錄音, 錄音多久
    //        record?.recordForDuration(2)
    }
    
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        // 獲取當(dāng)前的錄音時間(長度, 錄音多久了)
        let duration = record?.currentTime ?? 0
    
        if duration < 2 {
            print("錄音時間太短, 清重新錄音")
    
            // 刪除當(dāng)前錄音的文件
            // 刪除文件, 一定要保證, 錄音停止
            record?.stop()
            record?.deleteRecording()
            return
        }
    
        print("錄音時間剛剛好,可以保存")
        record?.stop()
    
        // 可參考本文第5點(diǎn)通過lame轉(zhuǎn)音頻文件轉(zhuǎn)碼
    }
    
  3. 概念補(bǔ)充
    1. 編碼概念:編碼是信息從一種形式轉(zhuǎn)換為另一種形式的過程
    2. 編碼格式
    > AAC: AAC其實(shí)是“高級音頻編碼(advanced audio coding)”的縮寫,它是被設(shè)計(jì)用來取代MP3格式的。
    > HE-AAC: HE-AAC是AAC的一個超集,這個“HE”代表的是“High efficiency”。 HE-AAC是專門為低比特率所優(yōu)化的一種音頻編碼格式
    > AMR: AMR全稱是“Adaptive Multi-Rate”,它也是另一個專門為“說話(speech)”所優(yōu)化的編碼格式,也是適合低比特率環(huán)境下采用
    > ALAC: 它全稱是“Apple Lossless”,這是一種沒有任何質(zhì)量損失的音頻編碼方式,也就是我們說的無損壓縮
    > IMA4: 這是一個在16-bit音頻文件下按照4:1的壓縮比來進(jìn)行壓縮的格式。
    > MP3
    > LPCM : 即線性脈沖編碼調(diào)制,是一種非壓縮音頻數(shù)字化技術(shù),是一種未壓縮的原音重現(xiàn);數(shù)字模式下, 音頻的初始信號是PCM

         > 參考資料地址
         http://baike.baidu.com/link?url=z36Nw7UihAEnCC6BjCygft9rBpLr29Ru0of_9Blpl0aR6qzI1B9iWTD5h3uimPVix2SuuQYo7GVYOIsaaP2Eyq
    
     3. 文件格式(不同的文件格式, 可保存不同的編碼格式)
         > WAV :
             特點(diǎn): 音質(zhì)最好的格式, 對應(yīng)PCM編碼
             適用: 多媒體開發(fā)、保存音樂和音效素材。
    
         > MP3 :
             特點(diǎn): 音質(zhì)好,壓縮比比較高,被大量軟件和硬件支持
             適用: 適合用于比較高要求的音樂欣賞。
    
         > caf :
             特點(diǎn): 適用于幾乎iOS中所有的編碼格式
    
  4. 開發(fā)經(jīng)驗(yàn)
    1. caf 文件格式, 因?yàn)槟承┚幋a設(shè)置, 文件有可能會很大, 而且caf, 格式并不是很通用, 所以在開發(fā)過程中, 一般會進(jìn)行壓縮轉(zhuǎn)碼, MP3;

  5. 使用lame靜態(tài)庫轉(zhuǎn)碼

    • iOS 通過(lame)將錄制音頻轉(zhuǎn)換成Mp3
      1. LAME是一個開源的MP3音頻壓縮軟件。LAME是一個遞歸縮寫,來自LAME Ain't an MP3 Encoder(LAME不是MP3編碼器)。它自1998年以來由一個開源社區(qū)開發(fā),目前是公認(rèn)有損品質(zhì)MP3中壓縮效果最好的編碼器。
      2. 步驟:
      第一步: 下載lame的最新版本并解壓:http://sourceforge.net/projects/lame/files/lame/3.99/
      第二步:生成靜態(tài)庫
      1. 下載build的腳本:https://github.com/kewlbear/lame-ios-build
      2. 提升權(quán)限:命令行中輸入sudo -s
      3. 修改腳本權(quán)限(所有人有可執(zhí)行權(quán)限):chmod a+x 腳本名稱
      4. 執(zhí)行腳本:./腳本名稱
      5. 注意: 如果最終沒有生成靜態(tài)庫:
      1. 先檢查XCode應(yīng)用名稱是否是XCode(后面不要加2, 3 之類的東西)
      2. commod + , 把命令行工具選中
      第三步:導(dǎo)入靜態(tài)庫到工程, 開始使用,最好封裝成一個分類,提供一個轉(zhuǎn)碼的方法
  6. 錄音其他使用

  7. 錄音詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. 導(dǎo)入錄音功能依賴的框架 2. 在相應(yīng)界面引入頭文件 然后遵守協(xié)議AVAudioRecorderDelegat...
    黑白灰的綠i閱讀 6,508評論 6 13
  • 需要使用AVFoundatiaon框架 創(chuàng)建錄音對象 根據(jù)需求, 進(jìn)行錄音/暫停/停止3.1開始錄音 3.2暫停錄...
    e85a0a8a9ba4閱讀 852評論 0 4
  • 1.界面布局,以及相關(guān)功能 點(diǎn)擊中間開始錄音,點(diǎn)擊左上角播放或暫停播放,點(diǎn)擊右上角移除文件 2.定義相關(guān)屬性 #i...
    大雨可洗頭閱讀 5,356評論 4 5
  • 簡介 簡單來說,音頻可以分為2種 音效 又稱“短音頻”,通常在程序中的播放時長為1~2秒 在應(yīng)用程序中起到點(diǎn)綴效果...
    JonesCxy閱讀 949評論 1 2
  • 雷聲漸漸響起,女孩走在馬路邊。一輛車向她這沖過來,女孩沒有躲開,臉上沒有絲毫恐懼。"慕依依,你不是瘋了。"女...
    筱千瑤閱讀 598評論 1 0