分享一個很久以前做的G.726編碼語音傳輸程式碼
阿新 • • 發佈:2019-02-17
很久之前做了個基於G.726編碼的單向語音傳輸的東東。簡單說就是一個人用Android手機說話,然後處於同一區域網的PC機能聽到。
原理就是Android手機採集語音的PCM編碼,然後用NDK在底層編碼成G.726碼流,通過組播在區域網傳播,PC端接收資料,通過G.726動態連線庫解碼成PCM流,通過SDL庫的播放出來,當然通話質量並不是很好。
這裡用到了Sun公司的G.726語音編碼庫,C語言編寫。我通過Android NDK把它編譯成.so動態庫供上層Java呼叫,用VC++6.0編譯成.lib動態庫。
編解碼最主要就是如下兩個函式:
void g726_Encode(unsigned char *speech,char *bitstream); void g726_Decode(char *bitstream,unsigned char *speech);
我在Android端採集的是8KHz取樣,16位量化PCM編碼的單聲道資料,上述G.726編碼庫的壓縮比是8:1,理論上編碼後的資料為:8000*16/8=16Kbps=2KBps,1分鐘是120KB,如果雙向通話就是240KB,如果打個電話5分鐘的話,就是1.2MB的流量,呃,也不少吧。
當然G.726是早期的編碼啦,現在的諸如Speex的編碼庫可以做到可變位元率,在靜音時節省流量。
我後來也完成了G.729庫的編解碼,壓縮比是16:1,流量更小,通話質量也不錯,有空再整理吧。
本文提到的原始碼可以在我上傳的資源裡下載。