音頻基礎(chǔ)知識
組成
音頻文件的組成:文件格式(或者音頻容器) + 數(shù)據(jù)格式(或者音頻編碼)秉沼。
文件格式(或音頻容器)是用于形容文件本身的格式臀突。
我們可以通過多種不同的方法為真正的音頻數(shù)據(jù)編碼冕香。例如CAF文件便是一種文件格式纷捞,它能夠包含MP3格式松靡,線性PCM以及其它數(shù)據(jù)格式的音頻狐榔。
數(shù)據(jù)格式(或音頻編碼)
我們將從音頻編碼開始闡述(而不是文件格式)坛增,因為編碼是最重要的環(huán)節(jié)。
線性PCM:
這是表示線性脈沖編碼調(diào)制薄腻,主要是描寫用于將模擬聲音數(shù)據(jù)轉(zhuǎn)換成數(shù)字格式的技術(shù)收捣。簡單地說也就是未壓縮的數(shù)據(jù)。因為數(shù)據(jù)是未壓縮的庵楷,所以我們便可以最快速地播放出音頻罢艾,而如果空間不是問題的話這便是iPhone音頻的優(yōu)先代碼選擇。
音頻文件計算大小
聲卡對聲音的處理質(zhì)量可以用三個基本參數(shù)來衡量尽纽,即采樣頻率咐蚯、采樣位數(shù)和聲道數(shù)。
采樣頻率:
是指單位時間內(nèi)的采樣次數(shù)弄贿。采樣頻率越大春锋,采樣點之間的間隔就越小,數(shù)字化后得到的聲音就越逼真差凹,但相應(yīng)的數(shù)據(jù)量就越大期奔。聲卡一般提供11.025kHz、22.05kHz和44.1kHz等不同的采樣頻率危尿。
采樣位數(shù):
是記錄每次采樣值數(shù)值大小的位數(shù)呐萌。采樣位數(shù)通常有8bits或16bits兩種,采樣位數(shù)越大谊娇,所能記錄聲音的變化度就越細膩肺孤,相應(yīng)的數(shù)據(jù)量就越大。
聲道數(shù)
是指處理的聲音是單聲道還是立體聲济欢。單聲道在聲音處理過程中只有單數(shù)據(jù)流赠堵,而立體聲則需要左、右聲道的兩個數(shù)據(jù)流法褥。顯然顾腊,立體聲的效果要好,但相應(yīng)的數(shù)據(jù)量要比單聲道的數(shù)據(jù)量加倍挖胃。
聲音數(shù)據(jù)量的計算公式為:
數(shù)據(jù)量(字節(jié)/秒)= (采樣頻率(Hz)× 采樣位數(shù)(bit)× 聲道數(shù))/ 8
單聲道的聲道數(shù)為1,立體聲的聲道數(shù)為2。
【例1】請計算對于5分鐘雙聲道酱鸭、16位采樣位數(shù)吗垮、44.1kHz采樣頻率聲音的不壓縮數(shù)據(jù)量是多少?
根據(jù)公式:數(shù)據(jù)量=(采樣頻率×采樣位數(shù)×聲道數(shù)×時間)/8
得凹髓,數(shù)據(jù)量(MB)=[44.1×1000×16×2×(5×60)] /(8×1024×1024)=50.47MB
計算時要注意幾個單位的換算細節(jié):
時間單位換算:1分=60秒
采樣頻率單位換算:1kHz=1000Hz
數(shù)據(jù)量單位換算:1MB=1024×1024=1048576B
【例2】請計算對于雙聲道立體聲烁登、采樣頻率為44.1kHz、采樣位數(shù)為16位的激光唱盤(CD-A)蔚舀,用一個650MB的CD-ROM可存放多長時間的音樂饵沧?
已知音頻文件大小的計算公式如下:
文件的字節(jié)數(shù)/每秒=采樣頻率(Hz)X采樣位數(shù)(位)X聲道數(shù)/8
根據(jù)上面的公式計算一秒鐘時間內(nèi)的不壓縮數(shù)據(jù)量:(44.1×1000×16×2)/8=0.168MB/s
那么,一個650MB的CD-ROM可存放的時間為:(650/0.168)/(60×60)=1.07小時赌躺。
學習之前必須了解一些音頻框架之類的東西狼牺,比如文件格式與數(shù)據(jù)格式(編碼格式),比特率礼患,采樣率是钥,軌道,聲道缅叠,F(xiàn)FT(傅里葉快速變化)悄泥,頻譜等。查了網(wǎng)上很多資料肤粱,到現(xiàn)在還是一知半解啊弹囚。。领曼。擦擦擦鸥鹉。。悯森。宋舷。接著要整體了解下ios為我們提供處理音頻的基礎(chǔ)技術(shù):核心音頻(core Audio)
有5個框架:
1.Core Audio.framework
2.AudioToolbox.framework
3.AudioUnit.framework
4.AVFoundation.framework
5.OpenAL.framework
由于核心音頻本身是一個很大的話題,涉及到很多領(lǐng)域的不同服務(wù)瓢姻。因此祝蝠,我們又將核心音頻分割成較小的模塊,方便我們?nèi)ダ斫釧PI以及框架
1.AudioToolbox.framework:
(1)音頻隊列服務(wù)(Audio
Queue service)(2)音頻會話服務(wù)(Audio session service)
(3)音頻文件服務(wù)
(4)音頻文件流式服務(wù)
(5)音頻轉(zhuǎn)化服務(wù)
(6)系統(tǒng)聲音服務(wù) (7)擴展的音頻文件服務(wù)
2.AudioUnit.framework:音頻單元服務(wù)
3.OpenAL.framework:
OpenAL
4.AVFoundation.framework:
(1)AVAudioPlayer(2)AVAudioRecorder(3)AVAudioSession
5.CoreAudio:這個框架并不提供服務(wù)幻碱,僅提供其他框架可以使用的頭文件和數(shù)據(jù)類型
一绎狭、音頻播放
1.AVAudioPlayer
(1)在AVFoundation.framework框架中
(2)屬性
(3)方法
(4)如何使用
2.音頻服務(wù)(System
Sound Services)
3.音頻隊列(Audio
Queue Services)
4.OpenAL
5.MPMusciPlayController
6.音頻單元服務(wù)
7.系統(tǒng)聲音播放等
二、音頻錄制
1.AVAuidoRecorder
2.Audio
Queue Services等
三褥傍、音頻剪切(截壤芩弧)
NSString*path = [[NSBundle mainBundle] pathForResource:@"陳奕迅 - 想哭" ofType:@"mp3"];
NSURL *songURL =[NSURL fileURLWithPath:path];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:songURL options:nil];
2.創(chuàng)建音頻文件
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectoryPath = [dirs objectAtIndex:0];
NSString *exportPath = [[documentsDirectoryPath
stringByAppendingPathComponent:EXPORT_NAME] retain];EXPORT_NAME為導出音頻文件名
if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) {
[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}
NSURL *exportURL = [NSURL fileURLWithPath:exportPath];
AVAssetWriter *assetWriter = [[AVAssetWriter assetWriterWithURL:exportURL
fileType:AVFileTypeCoreAudioFormat
error:&assetError]
retain];
if (assetError) {
NSLog (@"error: %@", assetError);
return;
}
3.創(chuàng)建音頻輸出會話
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:songAsset presetName:AVAssetExportPresetAppleM4A];
4.設(shè)置音頻截取時間區(qū)域 (CMTime在Core Medio框架中,所以要事先導入框架)
CMTime startTime = CMTimeMake([_startTime.text floatValue], 1);
CMTime stopTime = CMTimeMake([_endTime.text floatValue], 1);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
5.設(shè)置音頻輸出會話并執(zhí)行
exportSession.outputURL = [NSURL fileURLWithPath:filePath]; // output path
exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
exportSession.timeRange = exportTimeRange; // trim time range
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if (AVAssetExportSessionStatusCompleted == exportSession.status) {
NSLog(@"AVAssetExportSessionStatusCompleted");
}else if (AVAssetExportSessionStatusFailed == exportSession.status) {
a failure may happen because of an event out
of your control
for example, an interruption like a phone call
comming in
make sure and handle this case appropriately
NSLog(@"AVAssetExportSessionStatusFailed");
}else {
NSLog(@"Export Session Status: %d",exportSession.status);
}
}];
總得來說:我們再APP的目錄下創(chuàng)建了音頻文件恍风,然后創(chuàng)建了一個音頻的AVAsset對象(AVAsset代表一個抽象的媒體蹦狂,包含標題誓篱,文件大小等等),接著創(chuàng)建一個AVAsset的輸出會話AVAssetExportSession,最后就是設(shè)置我們要剪切(截瓤ā)的時間區(qū)域CMTimeRange窜骄,然后執(zhí)行AVAssetExportSeesion的回調(diào)函數(shù)exportAsynchronouslyWithCompletionHandler。