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
opus代码解析的更多相关文章
- VBA常用代码解析
031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- Kakfa揭秘 Day8 DirectKafkaStream代码解析
Kakfa揭秘 Day8 DirectKafkaStream代码解析 今天让我们进入SparkStreaming,看一下其中重要的Kafka模块DirectStream的具体实现. 构造Stream ...
- linux内存管理--slab及其代码解析
Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...
- MYSQL常见出错mysql_errno()代码解析
如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...
随机推荐
- 十、Strategy 策略模式
需求:使用不同的算法解决相同的问题 设计原理: 代码清单: 接口 Strategy public interface Strategy { public abstract Hand nextHand( ...
- 转 - spring security oauth2 password授权模式
原贴地址: https://segmentfault.com/a/1190000012260914#articleHeader6 序 前面的一篇文章讲了spring security oauth2的c ...
- Django 学生信息 添加 功能 遇到的问题.
1 添加 班级信息时的问题 (grade为外键) 原因是 grade 必需接收 一个 实例, 而我交是一个 str字符串, if request.method == 'POST': data = { ...
- mysql学习笔记--数据库单表查询
一.查询语句 1. select [选项] 列名 [from 表名] [where 条件] [order by 排序] [group by 分组] [having 条件] [limit 限 ...
- 音频音乐播放 Service
界面效果: 界面就一个播放的Button和一个进度条SeekBar,也可以自己加上两个显示时间的TextView: 点击播放时,有音乐声音,进度条也会自动更新,Button文字变成暂停 ...
- 通过启动函数定位main()函数
如下,通过vc6.0编写一个hello world程序.尝试结合汇编代码.分析启动函数找到main函数. 在printf(xxx)插入断点,调试执行.如下,在堆栈窗口中可见main()下的一个 ...
- Python类继承(转发)
目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...
- swift 设置阴影和圆角
1.正常view设置阴影 func setShadow(view:UIView,sColor:UIColor,offset:CGSize, opacity:Float,radius:CGFloat) ...
- eclipse中启动项目报内存溢出问题通过修改配置解决
标注:添加下面的参数还是挺管用的,本人亲测可试,同时启用两个项目,总是报堆内存不足,加了下面的参数后变可以同时正常运行了. 错误如下: Error occurred during initializ ...
- SQLite 安装
Windows 平台安装 下载地址:https://www.sqlite.org/download.html 下载预编译的安装包 将下载的安装包=解压到一个文件夹,有三个重要文件: sqlite3.e ...