天天看點

3gpp amr 源碼 windows 下編譯及使用

從 3gpp.org 下載下傳的 amrnb 源碼在網上的資料很少,找了一圈沒有找到比較系統的介紹。從諸多資料裡看到 3gpp 裡 amr 的根源,google android, ffmpeg 之類的好像也從 3gpp 裡出來。amr 的根源暫且不究。現在 windows 下編譯 3gpp 源碼包裡的 coder & decoder, 學習之用。

事實上 3gpp 源碼沒有依賴什麼庫,編譯很簡單。隻是資料較少,剛上手時偶爾會頭大。

1. 從 http://www.3gpp.org/  下載下傳源碼包。26073-b00.zip 和 ts_126073v110000p0.zip 兩個裡面都有 c-code 源碼。不同在于其他一些 .doc 之類的文檔。大體看了一下,裡面的文檔都基本沒用,可略過。

2. 3gpp 源碼号稱是标準 ansi c code, 市面上大多數編譯器應該都能編譯過。事實應該也是,我用 msvc 編譯時很順利,沒有出現一堆 warning 之類的。nice code. 用 msvc 之前在 debian7 下試圖直接 make, 提示 can't determine architecture. 應該是需要加 -D 之類的定義,這個可以後期再嘗試一下。typedefs.h 裡有細節。

3. 3gpp 源碼裡有 codec 還有 coder/decoder 兩個 bin,  codec 還不知道如何單獨編譯,先編譯 coder & decoder

----------------------------------------

1. 建立 win32 console 程式 (ms vs2k5)

2. 根據 src 裡的 makefile, 把 coder 需要的 coder.c 和一堆 .h 複制到目錄下,有些 .h 檔案有同名的 .c 檔案,一并複制

3. 把 .c 檔案加到工程,編譯,會有一堆提示,少檔案,挨個把檔案都複制到目錄下,.c 檔案添加到工程 (注意這裡有 .tab 檔案,也要複制,不過不需要加到工程)

4. 不斷重複步驟3就可以得到 coder & decoder 兩個 .exe 了

----------------------------------------

Issue:

1. 要用 __MSDOS__ 定義

2. coder 裡用 VAD1 定義,decoder 不用。coder 裡的 vad2.c 會有函數未定義,編譯不通過。這裡直接把 vad2.c 從工程去掉就可以。vad 預設是使用 vad1, vad2 不用也可以。

3. error LNK2001: unresolved external symbol _extract_h 這個在 basic_op.h 裡,對應的源檔案 basicop2.c, 加進工程即可。

----------------------------------------

得到 coder.exe & decoder.exe 後,測試一下。用 win32 waveIn/waveOut 系列 API 寫了個程式,把 8khz, 16bits, 單聲道的 pcm 裸資料直接寫檔案。先确定 record & playback 都ok, 再用 coder decoder 分别做編碼和解碼。測試結果是可用的。不過有一點,coder 生成的結果檔案大小不是純 amr 資料。我用 MR475 作 coder 的 mode 參數,得到的檔案比 pcm 源檔案還大。跟進源碼裡看了下,是因為其在寫檔案時,是每frame寫了 250*sizeof(WORD)大小,也就是一幀500位元組。是以檔案大小是對的,隻是我還不了解為什麼是這樣個寫法。正常的 475 格式應該是每frame 13 byte. 不知道其所謂的 bitstream file 是個什麼概念。對 amr 理論不熟,沒辦法了。

另外感覺 coder encode 速度也不夠快,應該是我的測試方法無說服力。理論上實時語音codec應該是要非常迅速的。

還不知道 .amr 檔案格式的解析。這個網上資料多點,多翻翻就ok.

之前用過 speex 感覺蠻好的,不過好像最後的壓縮比沒 amr 高,另外據稱 amr 在手機上可以硬編硬解,是以速度上可能還有優勢。不過 amr 的音質真的是。。。

以前用過 g729, 看了一下,碼率在 8kbps, 比 amr 最低的 4.75 還是高點。而且 g729 好像沒有正經的開源實作。以前用過一個 .lib, 雖然是免費,不過感覺總是差了點。

有空再繼續,主要是 .amr 檔案的生成及回放,amr 應用于實時語音。

音視訊的資料實在太多,要老命。