zoukankan      html  css  js  c++  java
  • 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 

      

  • 相关阅读:
    【BZOJ】【1415】【NOI2005】聪聪和可可
    【ContestHunter】【弱省胡策】【Round5】
    【UOJ Round #8】
    【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
    【BZOJ】【2527】【POI2011】Meteors
    【ContestHunter】【弱省胡策】【Round4】
    【BZOJ】【3170】【TJOI2103】松鼠聚会
    【BZOJ】【2878】【NOI2012】迷失游乐园
    【BZOJ】【2434】【NOI2011】阿狸的打字机
    【BZOJ】【2435】【NOI2011】道路修建
  • 原文地址:https://www.cnblogs.com/dylancao/p/8320746.html
Copyright © 2011-2022 走看看