很久之前做了个基于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,流量更小,通话质量也不错,有空再整理吧。
本文提到的源码可以在我上传的资源里下载。
PC端 http://download.youkuaiyun.com/detail/chenxupro/3930982
Android端 http://download.youkuaiyun.com/detail/chenxupro/3930978