对Speex音频处理库的学习

前端时间粗略学习了一下speex,现在把研究的一些成果与结论总结如下:
1、speex的编码算法是自己的特有的编码算法,有一个指的提出的性能是“变比特率编码”,从自己的实验结果来看,对于“静音帧”,每帧只编码6个字节,其余的有声帧大概有40多个字节。
2、在android上测试,这种编解码算法的延迟、清晰度都很不错
3、编码、解码接口比较简单,对于编码器,主要有以下几个接口:
speex_encoder_init // 初始化,参数为编码模式,一般用窄带模式speex_nb_mode即可
speex_encoder_ctl // 参数设置,参数为句柄加一个键值对,比如要设置编码质量为8,调用如下代码即可:

int tmp = 8;
speex_encoder_ctl(handle, SPEEX_SET_QUALITY, &tmp);

speex_encode_int // 编码接口,输入原始音频数据,输出是SpeexBits指针。

speex_bits_write // 输出接口,输入为SpeexBits指针,输出为char *,该函数将编码后的数据输出到buffer中。

speex_encoder_destroy // 编码库释放接口
解码库的接口也类似编码库,因此调用起来十分方便。
4、回声消除功能
该功能是我实验的最重要的功能,但是实验没有成功。接口也很简单,如下:
speex_echo_state_init // 回声消除初始化,参数是两个int型数据,第一个参数为采样点个数,推荐与编码帧长度相接近或取20ms内的采样点个数(比如如果采样频率为8000,取160),最好2的整数次幂,第二个参数为过滤长度,一般取100ms内的采样点(比如如果采样频率为8000,取800),
该函数返回回声抵消实例句柄。
speex_echo_ctl // 回声消除参数设置,同speex_encoder_ctl,参数为句柄与键值对
speex_echo_capture // 回波处理。输入为输入音频数据,输出为回拨抵消后的音频数据。
echo_playback // 扬声器数据采集,输入为扬声器的输入音频数据。
speex_echo_state_reset // 重置状态
speex_echo_state_destroy // 释放回声消除

接口虽然简单,但是调用的时候却不是那么回事,经常会莫名其妙的出错,因为是用JNI调用,无法调试,因此很难跟踪。而PC上调用却不会出错。恰好那段时间事情比较多,就暂时放下了。不过从网上对speex的评价来看,该功能的效果也不是很理想。
5、其他功能
speex还支持其他的功能,主要有:
抑制噪音
自动增益控制(AGC)
静音检测(VAD)
不过从源码里看,静音检测并未单独成模块,而是集成到了编码器里了。即变比特率编码。抑制噪音与自动增益控制两项没有去研究,在此不再叙述。

posted @ 2013-02-06 10:07  jiaozebo  阅读(2502)  评论(0编辑  收藏  举报