opus代码解析

  opus的初始化函数如下所示,在初始化的过程中,从代码结构上来看,这里主要完成是内存的申请,基本参数的定义

cOpusEncoder *opus_encoder_create(opus_int32 Fs, int channels, int application, int *error)

  opus_int32 Fs采样率,这个是支持的范围从8k-48k都可以

  int channels 支持的信道,也就是使用的信道,一般是1个或2个,最高可以支持255个声道。

   int application 该

#define MODE_SILK_ONLY 1000
#define MODE_HYBRID 1001
#define MODE_CELT_ONLY 1002

三种模式,假如你要只是用语音,就选MODE_SILK_ONLY 只会听音乐,就选 MODE_CELT_ONLY 两者都有,就选 MODE_HYBRID

上面的几种模式在代码中也会根据初始化时 OPUS_SET_SIGNAL配置来选择,如下的配置就会在代码中自动选择MODE_SILK_ONLY 模式

opus_encoder_ctl(v_opus_enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));

带宽是必须要在初始的时候配置的,默认是 OPUS_BANDWIDTH_FULLBAND ,语音的话一般是OPUS_BANDWIDTH_WIDEBAND ,音乐的

时候使用默认即可。

  OPUS_FRAMESIZE_20_MS这个使用的帧长度是和设备的主频和输入的帧长度有密切关系的,要根据输入帧长度来判断使用哪种长度的

帧,不过,要注意,编码和解码要用一样的。

  opus_encoder_init函数这部分,silk和celt的参数都会被初始化,相对来说要多占用几十K的内存。笔者想把这个优化掉,可

是,尝试了几次,发现这个难度有点大,主要是两个耦合太紧密,很多场景下都需要使用混合模式,所以,为了节省一点点内存,

投入大精力优化不值得。在设置控制参数中,编码和解码使用的命令是不同的,下面第一个函数是编码,第二个函数是解码。

opus_encoder_ctl    // 这两个设置的参数要对应,就是压缩的时候设置的是什么参数,解压缩也要设置同样的,不然,会出现解压

opus_decoder_ctl    //编码错误的情况。

  opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_frame_size, unsigned char *data, opus_int32 out_data_bytes)

第一个参数OpusEncoder *st 是该系统的句柄,在初始化的时候申请的内存及初始的。第二个参数 const opus_int16 *pcm 是输入pcm格式的数据的起始

地址。第三个参数int analysis_frame_size 是输入的帧长度,这个是和设置的OPUS_FRAMESIZE_XX_MS对应的。unsigned char *data 这个是编码后

的数据起始地址, opus_int32 out_data_bytes 这个一般是最大的payload帧长度,一般是默认1275,代码中如下所示:

max_data_bytes = IMIN(1276, out_data_bytes);

  OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error) 在解码初始化的过程中,有几个地方需要注意,一个就是这里的采样率

和信道要和编码的一致,再者int opus_decoder_ctl(OpusDecoder *st, int request, ...) 函数的设置参数要和编码的一致。

  int opus_decode(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec)

这里几个参数要注意:

const unsigned char *data 就是编码后的起始地址

opus_int32 len 这个是编码后送入的长度,实际上,这个长度是和OPUS_FRAMESIZE_80_MS 或OPUS_FRAMESIZE_20_MS帧长度相对应的,

opus_val16 *pcm 解码后的pcm格式内存头,

int frame_size 解码后的pcm帧长度

int decode_fec 尝试恢复数据 详见网址:http://blog.csdn.net/xy_kok/article/details/73649776

  

上一篇:C#与C++的几个不同之处知识点


下一篇:Python_collections_deque双向队列