AVFoundation連續系列之一音頻錄制

AVFoundation連續系列之一音頻錄制

一.框架簡介

1.AVFoundation是基于CoreAudio、CoreVideo、CoreMedia、CoreAnimation之上處理基于時間的媒體數據的高層框架,在AVFoundation框架之上蘋果還提供給咱們更高層一些處理媒體數據的框架,如AVKit、iOS的UIKit、OS的AppKit。AVFoundation提供了大量強大的工具集,可通過這個框架處理音視頻編程。

2.可以實現的功能

1)音頻的錄制、播放

2)視頻的播放

3)媒體文件檢查

4)媒體捕捉

5)媒體編輯

6)媒體處理

7)媒體采樣

8)媒體壓縮

9)音頻編解碼

10)視頻編解碼

11)音頻的音效處理

3.包含的主要類:

AVAnimation動畫類

AVAsset:資產類可通過這個類獲得圖片、文件、媒體庫

AssetDownloadTask資源下載任務

AVAssetExportSession資源導出會話:是一個通過資源文件對象去創建一個指定預設的輸出的轉碼內容會話

AVAssetImageGenerator用于截取視頻某幀的畫面

AVAssetReader從資源讀取音視頻數據

AVAssetReaderOutput讀取資源文件輸出類

AVAssetResourceLoader資源文件的加載器會從AVURLAsset和代理方法得到加載的內容

AVAssetTrack資源的分軌

AVAssetTrackGroup這里面封裝了一組資源的分軌

AVAssetTrackSegment表示資源分軌的一段

AVAssetWriter資源文件寫入類

AVAssetWriterInput寫入文件的輸入類

AVAssetDownloadTask資源文件下載任務

AVCaptureDevice硬件捕獲設備類

AVCaptureInput從硬件捕獲設備獲得輸入的數據

AVCaptureOutput獲得輸出的數據

AVCaptureSession用于調配音視頻輸入與輸出之間的數據流

AVCaptureVideoPreviewLayer捕獲的視頻數據的預覽圖層

AVMetadataObject音視頻元數據是一個基類里面包含面部檢測的元數據和二維碼的元數據

AVPlayer音視頻播放器

AVPlayerItem音視頻播放的元素

AVPlayerItemMediaDataCollector音視頻播放器元素媒體數據收集器

AVPlayerItemOutput播放器元素輸出類

AVPlayerItemTrack播放器元素的分軌

AVPlayerLayer播放器的圖層

AVPlayerMediaSelectionCriteria播放器媒體選擇的規范

AVSampleBufferDisplayLayer用來顯示壓縮或解壓的視頻幀

AVSynchronizedLayer同步動畫圖層

AVTextStyleRule文本樣式的規范

AVVideoCompositing視頻合成的協議

AVAudioSettings音頻的配置信息

AVAudioEngine 音頻引擎

AVAudioNode音頻節點

AVAudioTime音頻時間類

AVMIDIPlayer MIDI播放器

AVAudioSession音頻會話

二.音頻的錄制

1.簡介

1)錄制AVAudioRecorder是基于Audio Queue Services

2)可通過Mac機器或iOS設備上的內置麥克風錄制音頻,也可通過外部音頻設備錄制

3)了解音頻會話

<1>所有的iOS應用程序都有音頻會話,不管是否是手動啟用,它都默認的音頻會話。

<2>可以根據音頻會話來決定音頻的狀態,如做游戲的時候音頻是否可以與背景音混合、音頻播放是核心功能還是次要功能

<3>下圖是音頻會話的分類功能查詢表


2.準備:

創建錄音對象需要為其提供一些信息

1)音頻流寫入到本地的本地文件URL,錄制之后會把錄制的音頻文件存到這個本地URL內

2)錄音的配置信息字典錄音的配置信息的key可以在AVAudioSettings中查看

<1>AVFormatIDKey寫入音頻的格式他對應的值可以在CoreAudio/CoreAudioTypes.h中查看,一定要注意!錄制的音頻保存的時候要與選擇的音頻格式匹配

var kAudioFormatLinearPCM: AudioFormatID { get }

public var kAudioFormatAC3: AudioFormatID { get }

public var kAudioFormat60958AC3: AudioFormatID { get }

public var kAudioFormatAppleIMA4: AudioFormatID { get }

public var kAudioFormatMPEG4AAC: AudioFormatID { get }

public var kAudioFormatMPEG4CELP: AudioFormatID { get }

public var kAudioFormatMPEG4HVXC: AudioFormatID { get }

public var kAudioFormatMPEG4TwinVQ: AudioFormatID { get }

public var kAudioFormatMACE3: AudioFormatID { get }

public var kAudioFormatMACE6: AudioFormatID { get }

public var kAudioFormatULaw: AudioFormatID { get }

public var kAudioFormatALaw: AudioFormatID { get }

public var kAudioFormatQDesign: AudioFormatID { get }

public var kAudioFormatQDesign2: AudioFormatID { get }

public var kAudioFormatQUALCOMM: AudioFormatID { get }

public var kAudioFormatMPEGLayer1: AudioFormatID { get }

public var kAudioFormatMPEGLayer2: AudioFormatID { get }

public var kAudioFormatMPEGLayer3: AudioFormatID { get }

public var kAudioFormatTimeCode: AudioFormatID { get }

public var kAudioFormatMIDIStream: AudioFormatID { get }

public var kAudioFormatParameterValueStream: AudioFormatID { get }

public var kAudioFormatAppleLossless: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_HE: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_LD: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_ELD: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_ELD_SBR: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_ELD_V2: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_HE_V2: AudioFormatID { get }

public var kAudioFormatMPEG4AAC_Spatial: AudioFormatID { get }

public var kAudioFormatAMR: AudioFormatID { get }

public var kAudioFormatAMR_WB: AudioFormatID { get }

public var kAudioFormatAudible: AudioFormatID { get }

public var kAudioFormatiLBC: AudioFormatID { get }

public var kAudioFormatDVIIntelIMA: AudioFormatID { get }

public var kAudioFormatMicrosoftGSM: AudioFormatID { get }

public var kAudioFormatAES3: AudioFormatID { get }

public var kAudioFormatEnhancedAC3: AudioFormatID { get }

<2> AVSampleRateKey采樣率輸入的模擬音頻信號每一秒的采樣數是影響音頻質量和音頻文件大小非常重要的一個因素采樣率越小文件越小質量越低如44.1kHz

<3> AVNumberOfChannelsKey通道數1為單通道2為立體通道

<4> PCM專用

1. AVLinearPCMBitDepthKey采樣位數又叫采樣值或取樣值用來衡量聲音波動變化的參數,我們可以理解為聲卡處理聲音的解析度值越大解析度就越高錄制和回放的聲音就越真實采樣位數的值8, 16, 24, 32這個Key是PCM專用的Key

2. AVLinearPCMIsBigEndianKey大端?小端?在內存中音頻的存儲模式。在計算機中通常采用的字節存儲機制主要有兩種:big-endian和little-endian,即大端模式和小端模式,可以理解為一段數據再內存中的起始位置以及終止位置他的值是波爾值這個key也是PCM專屬

3. AVLinearPCMIsFloatKey采樣信號是整數還是浮點數他的值是波爾值也是PCM專屬

4. AVLinearPCMIsNonInterleaved是否允許音頻交叉他的值是波爾值也是PCM專屬

<5>編碼部分

1. AVEncoderAudioQualityKey音質他的值是AVAudioQuality枚舉

1)Min

2)Low

3)Medium

4)High

5)Max

2.AVEncoderAudioQualityForVBRKey動態比特率編碼時候的音質值也是上面的枚舉只和AVAudioBitRateStrategy_Variable有關系

3.AVEncoderBitRateKey編碼時的比特率,是每秒傳送的比特(bit)數單位為bps(Bit Per Second),比特率越高傳送數據速度越快值是一個整數

4.AVEncoderBitRatePerChannelKey編碼時每個通道的比特率

5.AVEncoderBitRateStrategyKey編碼時比特率的策略下面是他的值

1)AVAudioBitRateStrategy_Constant常數

2)AVAudioBitRateStrategy_LongTermAverage平均數

3)AVAudioBitRateStrategy_VariableConstrained有限制的

4)AVAudioBitRateStrategy_Variable可變的

6.AVEncoderBitDepthHintKey編碼時候的采樣位數值從8-32

<6>采樣率轉換器的key

1.AVSampleRateConverterAlgorithmKey采樣率轉換器的算法值是下面

1)AVSampleRateConverterAlgorithm_Normal普通

2)AVSampleRateConverterAlgorithm_Mastering母帶處理

2.AVSampleRateConverterAudioQualityKey采樣率轉換器的音質值是AVAudioQuality枚舉

<7> AVChannelLayoutKey通道布局值是一個包含AudioChannelLayout的NSData對象

3.常用方法屬性

初始化public init(URL url: NSURL, settings: [String : AnyObject]) throws

預錄制public func prepareToRecord() -> Bool預錄值會執行AudioQueue初始化的過程 在創建錄制對象的時候還傳入了文件存儲的本地URL會在這時候創建 把錄制啟動的時間延遲降低

錄制public func record() -> Bool

暫停public func pause()

停止public func stop()

刪除正在錄制的public func deleteRecording() -> Bool

獲得錄音的狀態public var recording: Bool { get }

4.使用

創建音頻會話

<1>分析:

我們可以根據實際需求去選擇音頻會話的分類,在這里,我們如果僅僅需要錄音的話,我們可以選擇Record,如果同時還想將來還可以播放,那我們就需要選擇PlayAndRecord了。我們把創建音頻會話的代碼寫在加載完所有選項開始啟動app的時候didFinishLaunchingWithOptions,代碼如下:

<2>代碼

let audioSession = AVAudioSession.sharedInstance()

try!audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)

try!audioSession.setActive(true)

2)創建錄音對象

<1>設置錄音完畢之后 保存錄音的路徑 這里我們為了不覆蓋每一次錄制完成的音頻文件,我們采用時間戳作為音頻文件的名字,這樣就保障咱們的音頻文件不會被覆蓋了。代碼如下

func saveAudioPath() ->String{

letpath:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask,true).first!asNSString

letaudioName =String(NSDate().timeIntervalSince1970).stringByAppendingString(".caf")

returnpath.stringByAppendingPathComponent(audioName)

}

<2>創建錄音對象,注意我在前面把auidoRecorder聲明成了屬性

func preparerRecord(){

auidoRecorder =try! AVAudioRecorder.init(URL:NSURL.fileURLWithPath(saveAudioPath()),settings:[AVSampleRateKey:44100,AVEncoderAudioQualityKey:AVAudioQuality.High.rawValue])

auidoRecorder! .prepareToRecord()

}

<3>開始錄音、停止錄音控制

@IBActionfuncrecoderOrStop(sender: AnyObject){

letbutton:UIButton= senderas!UIButton

button.setTitle("停止錄音", forState: .Selected)

if auidoRecorder ==nil{

preparerRecord()

}

if auidoRecorder!.recording {

button.selected =false

auidoRecorder!.stop()

auidoRecorder =nil

print(saveAudioPath())

}else{

button.selected =true

auidoRecorder!.record()

}

}

好啦,咱們的音頻采集就搞定了,下一篇咱們去講怎么去播放咱們錄制好的音頻

如果喜歡請關注!我會盡全力堅持把AVFoundation這個框架講全,后面的內容會越來越有意思!

如果我哪有疏漏!請多多指出!謝謝!愿所有人每天都過的編程如此簡單!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容