编解码器:Opus编解码器的接口及使用
1.源码下载及编译
编解码器版本采用opus-1.3-beta,opus官网:https://www.opus-codec.org/
下载完成后解压源码,在VS2015上打开源码 opus-1.3-beta\win32\VS2015\opus.sln,共有5个项目,其中opus项目是opus编解码器的主要实现以及对外部提供接口,实际写程序的时候一定是基于该项目中接口的,opus_demo是基于opus项目写的一个命令行程序,可以通过命令行调用opus项目的编解码功能,操作实际的音频数据。另外三个是基于opus项目的测试程序。分别测试编码功能、解码功能以及API接口
右键点击opus_demo,设为启动项,并生成解决方案。生成之后就可以关闭VS了(因为主要在命令行下进行编解码操作)。
进入 opus-1.3-beta\win32\VS2015\Win32\Debug,里面有一个opus_demo.exe,在当前文件夹下SHIFT+右键选择在此处打开命令窗口,在命令台下使用源码目录README文档中的指令就可以操作。
Usage: opus_demo [-e] <application> <sampling rate (Hz)> <channels (1/2)><bits per second> [options] <input> <output>opus_demo -d <sampling rate (Hz)> <channels (1/2)> [options]<input> <output>mode: voip | audio | restricted-lowdelay
options:-e : only runs the encoder (output the bit-stream)-d : only runs the decoder (reads the bit-stream as input)-cbr : enable constant bitrate; default: variable bitrate-cvbr : enable constrained variable bitrate; default:unconstrained-bandwidth <NB|MB|WB|SWB|FB>: audio bandwidth (from narrowband to fullband);default: sampling rate-framesize <2.5|5|10|20|40|60>: frame size in ms; default: 20-max_payload <bytes>: maximum payload size in bytes, default: 1024-complexity <comp>: complexity, 0 (lowest) ... 10 (highest); default: 10-inbandfec : enable SILK inband FEC-forcemono : force mono encoding, even for stereo input-dtx : enable SILK DTX-loss <perc> : simulate packet loss, in percent (0-100); default: 0input and output are little-endian signed 16-bit PCM files or opus
bitstreams with simple opus_demo proprietary framing.
举例:
opus_demo -e voip 48000 1 16000 -framesize 10 C:\Users\tengxc\Desktop\zhou.pcm c:\Users\tengxc\Desktop\zhou.opus
2.opus编码器接口
opus编解码器接口的定义主要在opus工程源码中的opus.h文件中。以C语言的方式提供。
编码器接口中有一个重要的结构体变量 struct OpusEncoder,它表示编码器状态,结构体中包含很多变量用来统计opus编码器的状态,使用时用先 typedef struct OpusEncoder OpusEncoder;
创建编码器:
opus接口中创建编码器的方式有两种,因此与之对应的释放编码器的方式也有两种,创建编码器时可以选用
OpusEncoder* enc;
OpusEncoder *opus_encoder_create(opus_int32 Fs, int channels, int application, int *error);
举例:enc = opus_encoder_create(16000, 1, OPUS_APPLICATION_VOIP, &err_num);
参数:采样率、通道数、应用类型、错误码
或者
OpusEncoder *enc;
size = opus_encoder_get_size(channels);
enc = malloc(size);
err_num = opus_encoder_init(enc, Fs, channels, application);
参数:同上
两种创建编码器的方式差异在于表示编码器状态的结构体内存申请方式不一样,第一种内存的申请方式为opus_encoder_create函数申请内存后返回一个首地址指针,第二种是自己申请一块内存后用opus_encoder_init函数填充。
编码音频数据:
编码音频数据也分为两种方式,一种是float型,一种是int型。
opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes);
举例:opus_int32 len = opus_encode(enc, pcm, 960, out, 4000);
参数:解码器状态指针、音频原始数据、以样本个数为单位的帧长度、编码完成的数据、最大的编码后数据长度
或者
opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes);
举例:opus_int32 len = opus_encode(enc, pcm, 960, out, 4000);
参数:同上
在这两种编码方式中,浮点型编码是更加损耗CPU,但是因此获得的编码精度更高,所以音质更加精准,而16位in整型编码是更多机器支持的,编码精度稍低,对CPU的损耗也小一点。
释放编码器:
当采用opus_encoder_create创建编码器时,需要用opus_encoder_destroy释放。
opus_encoder_destroy(OpusEncoder *st);
举例:opus_encoder_destroy(enc);
参数:编码器状态结构指针
当采用opus_encoder_init创建编码器时,需要用free释放。
举例:free(enc); //由于前面是使用malloc申请的内存
参数:编码器状态结构指针
修改编码参数:
opus支持编码器运行时的参数修改。
int opus_encoder_ctl(OpusEncoder *st, int request, ...);
举例:opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));
参数:编码器状态结构指针、设置的参数
编解码器:Opus编解码器的接口及使用相关推荐
- 【Android FFMPEG 开发】FFMPEG 获取编解码器 ( 获取编解码参数 | 查找编解码器 | 获取编解码器上下文 | 设置上下文参数 | 打开编解码器 )
文章目录 博客简介 . FFMPEG 编解码器获取流程 I . FFMPEG 获取音视频流的编解码参数 AVCodecParameters *codecpar II . FFMPEG 查找解码器 av ...
- Opus:IETF低延迟音频编解码器:API和操作手册
https://www.zybuluo.com/khan-lau/note/383775 Opus简介 Opus编解码器是专门设计用于互联网的交互式语音和音频传输.它是由IETF的编解码器工作组设计的 ...
- 编解码器杂谈:浅析 Opus
作者:赵晓涵,声网 Agora 音频算法工程师.原文首发于 RTC 开发者社区. 谈起 Opus,对于编解码器有所了解的同学也许会知道,Opus 是由两个编解码器--Silk 和 Celt 融合而成. ...
- 新的Google Lyra音频编解码器对实时视频流意味着什么?
正文字数:2602 阅读时长:4分钟 通过语言编码中的码率缩减趋势,Lyra与Opus中的区别比较,Lyra的作用,XDN平台上的高效语音编码技术几个方面探讨新的Google Lyra音频编解码器对 ...
- 如何在Android Framework中添加自定义硬件编解码器?
原文:How to add custom hardware codec to Android Framework? http://gopinaths.gitlab.io/post/custom_har ...
- 突破压缩极限的AI语音编解码器
I. Speech Codecs 语音编码的目的是在保持语音质量的前提下尽可能地减少传输所用的带宽,主要是利用人的发声过程中存在的冗余度和人的听觉特性达到压缩的目的.经过了多年的发展,目前语音编解码器 ...
- E1立体声卡侬头(XLR) 音频编解码器产品介绍
FCA系列音频编解码器是一种采用数字处理芯片及大规模FPGA.数字编解码转换和时钟恢复技术方法设计的基于E1(2M)通道传输立体声广播信号的广播传送设备系统,它可以借助目前成熟可靠的E1传输系统网,建 ...
- Logstash【从无到有从有到无】【L20】编解码器插件(Codec plugins)
1.编解码器插件 编解码器插件可更改事件的数据表示形式. 编解码器本质上是流过滤器,可以作为输入或输出的一部分进行操作. 下面提供了以下编解码器插件. 有关Elastic支持的插件的列表,请查阅Sup ...
- 360°视频的视频编解码器性能评估中的常见测试条件和软件参考配置
这几天一直阅读提案,发现状态不是很好,就把几篇我觉得很有用的提案摘录到这里.带(*)标识的地方是我还没懂的地方= =. 首先这篇提案是JVET common test conditions and e ...
最新文章
- 图灵奖得主LeCun力推无监督学习:要重视基于能量的学习方法
- 阿里巴巴为什么让初始化集合时必须指定大小?
- 《汇编语言》实验五课程
- 回味jQuery系列(1)-选择器
- python使用ctypes模块下的windll.LoadLibrary报OSError: [WinError 193] % 不是有效的 Win32 应用程序...
- 面向对象:包装类、对象处理、类成员
- 二维粗糙海面matlab,三维随机粗糙海面的Monte-Carlo仿真
- flume从指定网络端口采集数据输出到控制台
- java实现豆瓣回帖机器人
- Google 程序员消灭 Bug 的 5 大法宝!
- PHP将图片转换成base64编码,hash函数
- centos7 mysql5.6.35_Centos7.2.1511 编译安装Mysql5.6.35
- 【学习笔记】Unreal(虚幻)4引擎入门(三)
- JavaScript之网页对话框
- stm32命名规范总结
- (找不同问题)有 50 家人家,每家一条狗。有一天警察通知, 50 条狗当中有病狗,行为和正常狗不一样
- 培训2022年6月22日
- 从AOP到Spring AOP
- 穆迪分析的IFRS 9解决方案赢得两项风险技术奖
- Adobe Photoshop CS5 汉化包下载