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

  

opus代码解析的更多相关文章

  1. VBA常用代码解析

    031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...

  2. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  3. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  4. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

  5. [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...

  6. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  7. Kakfa揭秘 Day8 DirectKafkaStream代码解析

    Kakfa揭秘 Day8 DirectKafkaStream代码解析 今天让我们进入SparkStreaming,看一下其中重要的Kafka模块DirectStream的具体实现. 构造Stream ...

  8. linux内存管理--slab及其代码解析

    Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...

  9. MYSQL常见出错mysql_errno()代码解析

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

随机推荐

  1. 十、Strategy 策略模式

    需求:使用不同的算法解决相同的问题 设计原理: 代码清单: 接口 Strategy public interface Strategy { public abstract Hand nextHand( ...

  2. 转 - spring security oauth2 password授权模式

    原贴地址: https://segmentfault.com/a/1190000012260914#articleHeader6 序 前面的一篇文章讲了spring security oauth2的c ...

  3. Django 学生信息 添加 功能 遇到的问题.

    1  添加 班级信息时的问题 (grade为外键) 原因是 grade 必需接收 一个 实例, 而我交是一个 str字符串, if request.method == 'POST': data = { ...

  4. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

  5. 音频音乐播放 Service

    界面效果:         界面就一个播放的Button和一个进度条SeekBar,也可以自己加上两个显示时间的TextView: 点击播放时,有音乐声音,进度条也会自动更新,Button文字变成暂停 ...

  6. 通过启动函数定位main()函数

      如下,通过vc6.0编写一个hello world程序.尝试结合汇编代码.分析启动函数找到main函数.   在printf(xxx)插入断点,调试执行.如下,在堆栈窗口中可见main()下的一个 ...

  7. Python类继承(转发)

    目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...

  8. swift 设置阴影和圆角

    1.正常view设置阴影 func setShadow(view:UIView,sColor:UIColor,offset:CGSize, opacity:Float,radius:CGFloat) ...

  9. eclipse中启动项目报内存溢出问题通过修改配置解决

     标注:添加下面的参数还是挺管用的,本人亲测可试,同时启用两个项目,总是报堆内存不足,加了下面的参数后变可以同时正常运行了. 错误如下: Error occurred during initializ ...

  10. SQLite 安装

    Windows 平台安装 下载地址:https://www.sqlite.org/download.html 下载预编译的安装包 将下载的安装包=解压到一个文件夹,有三个重要文件: sqlite3.e ...