写了个安卓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 ;