amr文件格式分析【转http://blog.csdn.net/dinggo/article/details/1966444】
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) | 音頻幀大小(字節) | 幀頭(字節) | 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 |
?
說明:
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編碼方式”中表格中的說明)
Q:幀質量指示器,0:表示為壞幀。
后面的P補0。
?
5.??????異常幀分析
下圖是一個出現異常幀的示例:(zbc1217.amr)
?
?
?
?
從上圖可以看見,本amr音頻幀頭都是0x3C,但是在0x000091e6處,幀頭字節為0x44。與0x3C不一致。而在0x00009243處,才恢復到0x3C。
?
對異常幀的簡單處理辦法是,遇到異常幀就跳過異常幀。后面的讀幀算法有描述。
?
6.??????AMR幀讀取算法
因為可能存在異常幀,所以不一定所有的語音幀大小一致,對于跟正常幀大小不一致的,或者幀頭跟正常幀頭不一致的,就不交給解碼器,直接拋棄該壞幀。
?
讀取幀的算法,用C語言來編寫,readAMRFrame.c,JAVA可以用類似的方法。
下面是算法描述流程圖。
?
?
?
?
?
7.??????參考資料
l?????????rfc3267
http://www.rfc-editor.org/rfc/rfc3267.txt
http://ietfreport.isoc.org/rfc/PDF/rfc3267.pdf
l?????????3GPP TS 26.104 V?6.1.0?(2004-03)
http://www.3gpp.org/ftp/Specs/html-info/26104-CRs.htm
l?????????3GPP AMR Floating-point Speech Codec
http://www.3gpp.org/ftp/Specs/html-info/26104.htm
l?????????“amr編程匯總”
http://blog.csdn.net/windcao/archive/2006/01/04/570348.aspx
l?????????關于AMR文件格式的解釋
http://www.mcublog.com/blog/user1/11409/archives/2006/16832.html
l??????????
?
轉載于:https://www.cnblogs.com/songtzu/archive/2013/03/15/2961519.html
總結
以上是生活随笔為你收集整理的amr文件格式分析【转http://blog.csdn.net/dinggo/article/details/1966444】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统架构师
- 下一篇: Lucene提供的条件判断查询[转]