5.4 模式查询
Speex模式查询类似于speex_encoder_ctl和speex_decoder_ctl函数调用。因为模式是只读的,所以仅能获取一个特别模式的信息。函数调用如下:
void speex_mode_query(Speexmode *mode, int request, void *ptr);
其中request可允许的值有(除非特别声明,这些值通过指针ptr返回):
SPEEX_MODE_FRAME_SIZE 获取模式的帧大小(样本数)
SPEEX_SUBMODE_BITRATE 通过ptr获取子模式比特率(整数,单位bps)
5.5 封包和带内信号
有时期望每个数据包(或其他基本存储单元)不止包含一帧,此时可在调用speex_bits_write写数据流之前调用speex_encode N次来实现。若每个包的帧数不是由带外机制决定,则可以包含一个终止码。终止码用5位对代码15(十进制)编码,如表9.2所示。注意对于1.0.2版本,调用speex_bits_write自动插入终止码来填充最后一字节,这样没有任何其他费用并保证包里没有更多帧时Speex能准确检测到。
可以发送带内信息到另一端。这些信息之前加入一个包含4位信息类型代码的模式14的“伪帧”。表5.1列出了可能的代码,包含他们的意义和信息大小。大多数信息是要发送到另一端编码器或解码器的请求,可以自由接受或无视这些请求。默认的,无视所有带内信息。
表1 带内信号代码
最后,应用可以用代码13定义常用带内信息,信息字节大小用5位编码,解码器若不知如何解码则可以跳过它。
6 语音处理API(libspeexdsp)
对于1.2beta3版本,Speex中的非编解码部分单独分离成libspeexdsp库,包括预处理器,声学回声消除器,抖动缓冲器和重采样器。在UNIX环境下,可通过在编译器命令行中添加-lspeexdsp -lm链接到你的程序中。正如libspeex,libspeexdsp调用时可重入的,但不是线程安全的,这意味着可以在多线程中使用,但多线程中对同一状态的调用必须由互斥锁保护。
6.1 预处理器
调用Speex预处理器之前,首先需要头文件
#include <speex/speex_preprocess.h>
然后,创建预处理器状态:
SpeexPreprocessState *preprocess_state = spee