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
相关文章
- 《从零开始学Swift》学习笔记(Day 59)——代码排版
- Python Django URL逆向解析(通过Python代码逆向访问)代码示例
- Java GUI编程:swing创建窗体代码详解
- 【DSP视频教程】DSP视频教程第4期:Matlab Simulink生成C工程代码在STM32上运行(2022-03-17)
- 使用ABAP代码创建SAP S/4HANA系统的扩展字段
- 一段简单的JavaScript代码,模拟Angular数据绑定信息的解析和替换
- 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略
- 编程笔试(解析及代码实现):求不重复数字之和给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次。请写出程序求出这两个只出现了一次的数字之和
- 基于bp神经网络汽车自动变速器最佳挡位判断(Matlab代码实现)
- 打砖游戏,详解每一行代码,历经三个小时解析,初学可看
- 智能优化算法:蝗虫优化算法-附代码
- 933. 最近的请求次数-队列-力扣双百代码
- Python编程:使用pygments高亮代码
- Kafka的生产者和消费者代码解析
- 046:vue+openlayers 点击某点播放视频(示例代码)
- kexec代码详解1 - zlib.c解析1
- 3D点云重建0-11:MVSNet-源码解析(7)-测试评估代码解析(完结篇)
- 风格迁移2-05:MUNIT(多模态无监督)-源码无死角解析(1)-训练代码总览
- 风格迁移1-06:Liquid Warping GAN(Impersonator)-源码无死角解析(1)-训练代码总览
- 图书馆约座代码小结(2019-07-30)
- LightGBM最强解析,从算法原理到代码实现~