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這個框架講全,后面的內容會越來越有意思!
如果我哪有疏漏!請多多指出!謝謝!愿所有人每天都過的編程如此簡單!