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 ;
        

你可能感兴趣的:(g711a音频编码记录)