g711a音頻編碼記錄

寫了個安卓wav pcm http直播流的程序。客戶端採用sdl2 直接播放pcm.工作的很好,但是,非常耗費帶寬

差不多100kb/s的網速。非常不利於外網的音頻傳輸。嘗試用zlib壓縮,效果不盡理想。只壓縮成90%。節約了1/10帶寬

遂放棄。嘗試了安卓端mp3直播,效果不錯,差不多帶寬30kb/s 。但是mp3有個很大的問題,就是延遲增大了幾秒。研究了下

wav壓縮音頻格式,發覺還有g711a,這個算法比較簡單,就是將short的音頻數據壓縮成byte。空間節約了一半,網絡傳輸就可以達到50kb/s。經過幾個小時的搗鼓,實驗成功了。下面記錄下關鍵代碼。

安卓端。

wav頭 原來音頻格式是1 表示pcm 現在改成6 表示g711a

 header[20] = 6;  //這個表示a law PCM

 

採集音頻

    short[] inG711Buffer = new short[minBufferSize];
                    byte[] outG711Buffer = new byte[minBufferSize];
                    int nReadBytes = aRecord.read(inG711Buffer,0,inG711Buffer.length);
                    G711Code.G711aEncoder(inG711Buffer,outG711Buffer,nReadBytes); // g711編碼pcm
                     
                    SocketS.send2All(outG711Buffer,nReadBytes); 


    

c++

//解壓第一個參數的g711數據給pcm
        decode(g711_buffer, pcm, g711_buffer_size , G711_A_LAW);

       audio_pos = (Uint8 *)pcm;
        //Audio buffer length 
        audio_len = g711_buffer_size *2 ;
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章