寫了個安卓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 ;