AMR文件结构
轉自:http://blog.csdn.net/dinggo/article/details/1966444
https://blog.csdn.net/wlsfling/article/details/5875928
?
目錄
1.????概述
2.????AMR編碼方式
3.????AMR文件結構示范圖
4.????AMR幀頭格式分析
5.????異常幀分析
6.????AMR幀讀取算法
7.????參考資料
1.??????概述
現在很多智能手機都支持多媒體功能,特別是音頻和視頻播放功能,而AMR文件格式是手機端普遍支持的音頻文件格式。
?
AMR,全稱是:Adaptive Multi-Rate,自適應多速率,是一種音頻編碼文件格式,專用于有效地壓縮語音頻率。
?
AMR音頻主要用于移動設備的音頻壓縮,壓縮比非常高,但是音質比較差,主要用于語音類的音頻壓縮,不適合對音質要求較高的音樂類音頻的壓縮。
?
下面是兩個AMR示范文件,一個是新聞類,一個是歌曲,可以聽出來,音樂類壓縮成AMR格式后,音質大大降低。
| 編號 | 文件名 | 文件長度 | 時長 |
| 1 | h.amr??????????????(歌曲) | 409KB | 04:21 |
| 2 | zbc1217.amr | 242KB | 02:36 |
?
?
?
?
?
?
?
2.????????AMR編碼方式
AMR有多種編碼方式,每種編碼方式的采樣頻率不同:
?
| ? | 規格 | 比特率(kbps) | 音頻幀大小(字節) | 幀頭(1個字節) | FT |
| 0 | AMR 4.75 | ? | 13 | 04 00000100 | 0000 |
| 1 | AMR 5.15 | ? | 14 | 0C?00001100 | 0001 |
| 2 | AMR 5.9 | ? | 16 | 14 00010100 | 0010 |
| 3 | AMR 6.7 | ? | 18 | 1C?00011100 | 0011 |
| 4 | AMR 7.4 | ? | 20 | 24 00100100 | 0100 |
| 5 | AMR 7.95 | ? | 21 | 2C?00101100 | 0101 |
| 6 | AMR 10.2 | ? | 27 | 34 00110100 | 0110 |
| 7 | AMR 12.2 | ? | 32 | 3C?00111100 | 0111 |
?
說明:
04 的二進制:00000100
0C?的二進制:00001100
?
說明:
l?????????比特率是指將數字聲音由模擬格式轉化成數字格式的采樣率,采樣率越高,還原后的音質就越好。
?
l?????????比特率值與現實音頻對照:
16kbps=電話音質
24kbps=增加電話音質、短波廣播、長波廣播、歐洲制式中波廣播
40kbps=美國制式中波廣播
56kbps=話音
64kbps=增加話音(手機鈴聲最佳比特率設定值、手機單聲道MP3播放器最佳設定值)
112kbps=FM調頻立體聲廣播
128kbps=磁帶(手機立體聲MP3播放器最佳設定值、低檔MP3播放器最佳設定值)
160kbps=HIFI高保真(中高檔MP3播放器最佳設定值)
192kbps=CD(高檔MP3播放器最佳設定值)
256kbps=Studio音樂工作室(音樂發燒友適用)
?
l?????????音頻數據幀大小的計算:
amr?一幀對應20ms,那么一秒有50幀的音頻數據。由于比特率不同,每幀的數據大小也不同。
如果比特率是12.2kbs,那么每秒采樣的音頻數據位數為:
12200 / 50 = 244bit = 30.5byte,取整為31字節。
取整要四舍五入。
再加上一個字節的幀頭,這樣數據幀的大小為32字節。
3.??????AMR文件結構示范圖
下面是一個AMR文件示范:
?
?
從圖中可以看出,所有AMR文件頭標志是6個字節。(最后一個字節是換行符“/n”)
后面就緊跟的是音頻幀。這個文件是每幀32字節。
?
| 文件頭 |
| 語音幀?1 |
| 語音幀?2 |
| … |
?
?
4.??????AMR幀格式分析
?
AMR語音幀格式為幀頭和語音數據組成。
| 幀頭 | 語音數據 |
?
?
?
?
AMR語音幀頭占1個字節,如下圖所示:
?
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| P | FT | Q | P | P | |||
| 0 | ? | ? | ? | ? | 0 | 0 | 0 |
?
?
其中:
P = 0;
FT:Frame Type,對應不同編碼模式。(參見“2. AMR編碼方式”中表格中的說明),
用法:在解析了音頻幀的FT數據之后,就可以根據?“”AMR編碼方式表格“”來確定這個音頻文件的比特率。
Q:幀質量指示器,0:表示為壞幀。
后面的P補0。
5.??????異常幀分析
下圖是一個出現異常幀的示例:(zbc1217.amr)
?
?
從上圖可以看見,本amr音頻幀頭都是0x3C,但是在0x000091e6處,幀頭字節為0x44。與0x3C不一致。而在0x00009243處,才恢復到0x3C。
?
對異常幀的簡單處理辦法是,遇到異常幀就跳過異常幀。后面的讀幀算法有描述。
?
6.??????AMR幀讀取算法
因為可能存在異常幀,所以不一定所有的語音幀大小一致,對于跟正常幀大小不一致的,或者幀頭跟正常幀頭不一致的,就不交給解碼器,直接拋棄該壞幀。
?
讀取幀的算法,用C語言來編寫,readAMRFrame.c,JAVA可以用類似的方法。
下面是算法描述流程圖。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
后記
采樣率,比特率,文件格式的說明:
?
通俗的講采樣頻率是指計算機每秒鐘采集多少個信號樣本。它用赫茲(Hz)來表示。
以上文中提到數據為例:
amr?一幀對應20ms,這個數值跟采樣率的關系:
1s=1000ms
20ms = 1000ms/50
采樣率為50hz
?
比特率:
音頻文件專用算法:【比特率】(kbps)=【量化采樣點】(kHz)×【位深】(bit/采樣點)×【聲道數量】(一般為2)
?
【比特率】(kbps) = 采樣率值×采樣大小值×聲道數 bps
?
以電話為例,每秒3000次取樣,每次取樣是7比特(bit),那么電話的比特率是21000。
?
反過來,知道了比特率跟采樣率,可以知道每次采樣的數據是多少bit,
12200 / 50 = 244bit = 30.5byte,取整為31字節。取整要四舍五入。
(為什么要四舍五入呢?猜測是因為在寫入文件的時候是按照 8 bits = 1 byte 來對齊的)
?
?
https://zhidao.baidu.com/question/1539029237582451067.html
?
如果把原始16位深調到32位,那么精度增大。就像一座1000米的山,原來有10級臺階,現在修成100級臺階,但高度沒變還是1000米。此外16位到32位也不是增加一倍,而是2的32-16=16次冪即65536倍。
?
量化精度:
??? 聲波在轉為數字的過程中不是只有采樣率會影響原始聲音的完整性,另一個亦具有舉足輕重的參數——量化精度,也是相當的重要。一般來說,音質分辨率就是大家常說的bit數。目前,絕大多數的聲卡都已經可以支持24bit的量化精度。
?那么,什么是量化精度呢?前面曾說明采樣頻率,它是針對每秒鐘所采樣的數量,而量化精度則是對于聲波的“振幅”進行切割,形成類似階梯的度量單位。所以,如果說采樣頻率是對聲波水平進行的X軸切割,那么量化精度則是對Y軸的切割,
切割的數量是以最大振幅切成2的n次方計算,n就是bit數。
??? 舉個例子,如果是8bit,那么在振幅方面的采樣就有256階,若是16bit,則振幅的計量單位便會成為65536階,越多的階數就越能精確描述每個采樣的振幅高度。如此,也就越接近原始聲波的“能量”,在還原的過程序也就越接近原始的聲音了。
?
【轉貼掃盲】位深度、采樣率以及碼率:
http://blog.renren.com/share/233588808/4959169016/0
?
轉載于:https://www.cnblogs.com/zhangxuan/p/8492905.html
總結