錄音
0. 應(yīng)用場景
語音聊天:大多數(shù)應(yīng)用在即時通訊APP中, 語音發(fā)送
語音備忘錄:錄一段音頻, 來記錄某件事情
1. 錄音步驟
-
導(dǎo)入AVFoundation框架
// OC #import <AVFoundation/AVFoundation.h> // swift import AVFoundation
-
使用類AVAudioRecorder進(jìn)行錄音
- 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];
- 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)碼 }
-
概念補(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中所有的編碼格式
開發(fā)經(jīng)驗(yàn)
1. caf 文件格式, 因?yàn)槟承┚幋a設(shè)置, 文件有可能會很大, 而且caf, 格式并不是很通用, 所以在開發(fā)過程中, 一般會進(jìn)行壓縮轉(zhuǎn)碼, MP3;-
使用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)碼的方法
-
iOS 通過(lame)將錄制音頻轉(zhuǎn)換成Mp3