錄音
0. 應(yīng)用場(chǎng)景
語(yǔ)音聊天:大多數(shù)應(yīng)用在即時(shí)通訊APP中, 語(yǔ)音發(fā)送
語(yǔ)音備忘錄:錄一段音頻, 來(lái)記錄某件事情
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)建錄音對(duì)象 _audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:nil]; // 4. 準(zhǔn)備錄音 [self.audioRecorder prepareToRecord]; // 5. 開(kāi)始錄音 [self.audioRecorder record]; // 6. 停止錄音 [self.audioRecorder stop];
- swift
var record: AVAudioRecorder? override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { // 開(kāi)始錄音 // 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)建一個(gè)錄音配置字典 // 錄音參數(shù)設(shè)置(不需要掌握, 一些固定的配置) // 這個(gè)配置, 可以保證, 音質(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)建錄音對(duì)象 record = try AVAudioRecorder(URL: fileURL, settings: configDic) }catch { print(error) return } // 2. 準(zhǔn)備錄音 record?.prepareToRecord() // 3. 開(kāi)始錄音 record?.record() // 從設(shè)置的時(shí)間點(diǎn),開(kāi)始錄音 // record?.recordAtTime((record?.deviceCurrentTime)! + 2) // 從后面的某個(gè)時(shí)間點(diǎn), 錄音多久 // record?.recordAtTime((record?.deviceCurrentTime)! + 2, forDuration: 3) // 從當(dāng)前時(shí)刻開(kāi)始錄音, 錄音多久 // record?.recordForDuration(2) } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { // 獲取當(dāng)前的錄音時(shí)間(長(zhǎng)度, 錄音多久了) let duration = record?.currentTime ?? 0 if duration < 2 { print("錄音時(shí)間太短, 清重新錄音") // 刪除當(dāng)前錄音的文件 // 刪除文件, 一定要保證, 錄音停止 record?.stop() record?.deleteRecording() return } print("錄音時(shí)間剛剛好,可以保存") record?.stop() // 可參考本文第5點(diǎn)通過(guò)lame轉(zhuǎn)音頻文件轉(zhuǎn)碼 }
-
概念補(bǔ)充
1. 編碼概念:編碼是信息從一種形式轉(zhuǎn)換為另一種形式的過(guò)程
2. 編碼格式
> AAC: AAC其實(shí)是“高級(jí)音頻編碼(advanced audio coding)”的縮寫(xiě),它是被設(shè)計(jì)用來(lái)取代MP3格式的。
> HE-AAC: HE-AAC是AAC的一個(gè)超集规揪,這個(gè)“HE”代表的是“High efficiency”泳姐。 HE-AAC是專門為低比特率所優(yōu)化的一種音頻編碼格式
> AMR: AMR全稱是“Adaptive Multi-Rate”度苔,它也是另一個(gè)專門為“說(shuō)話(speech)”所優(yōu)化的編碼格式匆篓,也是適合低比特率環(huán)境下采用
> ALAC: 它全稱是“Apple Lossless”,這是一種沒(méi)有任何質(zhì)量損失的音頻編碼方式寇窑,也就是我們說(shuō)的無(wú)損壓縮
> IMA4: 這是一個(gè)在16-bit音頻文件下按照4:1的壓縮比來(lái)進(jìn)行壓縮的格式鸦概。
> MP3
> LPCM : 即線性脈沖編碼調(diào)制,是一種非壓縮音頻數(shù)字化技術(shù)甩骏,是一種未壓縮的原音重現(xiàn);數(shù)字模式下, 音頻的初始信號(hào)是PCM> 參考資料地址 http://baike.baidu.com/link?url=z36Nw7UihAEnCC6BjCygft9rBpLr29Ru0of_9Blpl0aR6qzI1B9iWTD5h3uimPVix2SuuQYo7GVYOIsaaP2Eyq 3. 文件格式(不同的文件格式, 可保存不同的編碼格式) > WAV : 特點(diǎn): 音質(zhì)最好的格式, 對(duì)應(yīng)PCM編碼 適用: 多媒體開(kāi)發(fā)窗市、保存音樂(lè)和音效素材。 > MP3 : 特點(diǎn): 音質(zhì)好饮笛,壓縮比比較高咨察,被大量軟件和硬件支持 適用: 適合用于比較高要求的音樂(lè)欣賞。 > caf : 特點(diǎn): 適用于幾乎iOS中所有的編碼格式
開(kāi)發(fā)經(jīng)驗(yàn)
1. caf 文件格式, 因?yàn)槟承┚幋a設(shè)置, 文件有可能會(huì)很大, 而且caf, 格式并不是很通用, 所以在開(kāi)發(fā)過(guò)程中, 一般會(huì)進(jìn)行壓縮轉(zhuǎn)碼, MP3;-
使用lame靜態(tài)庫(kù)轉(zhuǎn)碼
-
iOS 通過(guò)(lame)將錄制音頻轉(zhuǎn)換成Mp3
1. LAME是一個(gè)開(kāi)源的MP3音頻壓縮軟件福青。LAME是一個(gè)遞歸縮寫(xiě)摄狱,來(lái)自LAME Ain't an MP3 Encoder(LAME不是MP3編碼器)。它自1998年以來(lái)由一個(gè)開(kāi)源社區(qū)開(kāi)發(fā)无午,目前是公認(rèn)有損品質(zhì)MP3中壓縮效果最好的編碼器媒役。
2. 步驟:
第一步: 下載lame的最新版本并解壓:http://sourceforge.net/projects/lame/files/lame/3.99/
第二步:生成靜態(tài)庫(kù)
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. 注意: 如果最終沒(méi)有生成靜態(tài)庫(kù):
1. 先檢查XCode應(yīng)用名稱是否是XCode(后面不要加2, 3 之類的東西)
2. commod + , 把命令行工具選中
第三步:導(dǎo)入靜態(tài)庫(kù)到工程, 開(kāi)始使用,最好封裝成一個(gè)分類宪迟,提供一個(gè)轉(zhuǎn)碼的方法
-
iOS 通過(guò)(lame)將錄制音頻轉(zhuǎn)換成Mp3