opus编解码的使用
opus简介以及优点:
Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由互联网工程任务组(IETF)进行标准化,目标用希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。
Opus集成了两种声音编码的技术:以语音编码为导向的SILK和低延迟的CELT。Opus可以无缝调节高低比特率。在编码器内部它在较低比特率时使用线性预测编码在高比特率时候使用变换编码(在高低比特率交界处也使用两者结合的编码方式)。Opus具有非常低的算法延迟(默认为22.5 ms),非常适合用于低延迟语音通话的编码,像是网络上的即时声音流、即时同步声音旁白等等,此外Opus也可以通过降低编码比特率,达成更低的算法延迟,最低可以到5 ms。在多个听觉盲测中,Opus都比MP3、AAC、HE-AAC等常见格式,有更低的延迟和更好的声音压缩率。
使用 decode 步骤及踩过的坑:
使用步骤:
1.创建opus解码器:
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(opus_int32 Fs,//采样率,可以设置的大小为8000, 12000, 16000, 24000, 48000.int channels,//声道数,网络中实时音频一般为单声道int *error//是否创建失败,返回0表示创建成功);
2.解码:
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(OpusDecoder *st, //上一步的返回值const unsigned char *data,//要解码的数据opus_int32 len, //数据长度opus_int16 *pcm, //解码后的数据,注意是一个以16位长度为基本单位的数组int frame_size, //每个声道给pcm数组的长度int decode_fec //是否需要fec,设置0为不需要,1为需要
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
3.把解码数据放入字符数组中
//注意是大端传入,所以应该转为小端
//注:frameSize是上一步的返回值,即每个声道返回的以2字节为单位的数组长度
//pcm是解码后的数据,即上一步的参数4
char *pcmData = new char[frameSize * channels * sizeof(opus_int16)];
for (int i = 0; i < channels * frameSize; ++i)
{pcmData[i * 2] = pcm[i] & 0xFF;pcmData[i * 2 + 1] = (pcm[i] >> 8) & 0xFF;
}
4.释放解码器
OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
踩过的坑:
1.对于连续的一段声音,一定只能用一个解码器(不能创建之后释放再去创建解码器)
2.如果使用fec,那么记得要自己检查seq确认丢失再使用fec,如果每一个包都使用fec,每一个都会给你解码出来数据的
使用demo,及decode总结
demo
class HandlerOpusImpl
{public://在构造函数中创建解码器HandlerOpusImpl() : _perSecNum(0){int sampleRate = 48000;int channels = 1;int err;_decoder = opus_decoder_create(sampleRate, channels, &err);}//传入要解码的数据srcData, 以string类型返回解码后的数据resultbool DecodeData(std::string srcData, std::string &result){int frameSize;int channels = CHANNELS;int sampleRate = SAMPLE_RATE;opus_int16 *out;char *pcmData;out = new opus_int16[SAMPLE_RATE / 50 * CHANNELS];//解码,如果frameSize小于0,那么说明解码失败frameSize = opus_decode(_decoder, (const unsigned char *)srcData.data(), srcData.size(), out, SAMPLE_RATE / 50 * CHANNELS, 0);if (frameSize <= 0){return false;}pcmData = new char[frameSize * channels * sizeof(opus_int16)];++_perSecNum;for (int i = 0; i < channels * frameSize; ++i){pcmData[i * 2] = out[i] & 0xFF;pcmData[i * 2 + 1] = (out[i] >> 8) & 0xFF;}//把数据赋值给resultstd::string(pcmData, sizeof(opus_int16) * channels * frameSize).swap(result);delete[]out;delete[]pcmData;return true;}//使用fec找回丢失的包,函数内容获取解码数据函数内容类似,不过fec标记位需要设置为1bool HandleLosePack(std::string srcData, std::string &result){int frameSize;int channels = CHANNELS;int sampleRate = SAMPLE_RATE;opus_int16 *out;char *pcmData;out = new opus_int16[SAMPLE_RATE / 50 * CHANNELS];frameSize = opus_decode(_decoder, NULL, 0, out, SAMPLE_RATE / 50 * CHANNELS, 1);if (frameSize <= 0){return false;}pcmData = new char[frameSize * channels * sizeof(opus_int16)];++_perSecNum;for (int i = 0; i < channels * frameSize; ++i){pcmData[i * 2] = out[i] & 0xFF;pcmData[i * 2 + 1] = (out[i] >> 8) & 0xFF;}std::string(pcmData, sizeof(opus_int16) * channels * frameSize).swap(result);delete[]out;delete[]pcmData;return true;}void DeleteCodec(){opus_decoder_destroy(_decoder);_decoder = NULL;}private:int _perSecNum;OpusDecoder *_decoder;
};
总结:
opus的使用并不复杂,不过网络上资料有限,靠着大哥们之前写过的代码才稍微理解了一些,希望可以给大家一些帮助,上面的代码是程序的一部分,并不能直接使用
opus编解码的使用相关推荐
- 走进音视频的世界——Opus编解码协议
Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时.带内FEC.DTX.PLC等特点,默认22.5ms延时,非常适用网络实时传输.官网:https://www.opus-codec.or ...
- 音视频编解码--Opus编解码系列1
1 简介 Opus 是一个完全开源,免费的,通用性高的音频解码器.Opus 在网络上有着无与伦比的交互式语音和音乐传播功能,但也可以用来存储,在流媒体上使用.Opus 遵从 Internet Engi ...
- 第十章---《实时语音处理实践指南》语音编/解码笔记
文章目录 1.语音编/解码简述 2.声音可以进行编码的原理 3.语音编码的过程 4.LPC编码 5.SILK编解码 6.Opus编解码 1.语音编/解码简述 编码的过程就是对语音进行压缩,压缩应该能 ...
- PCM(脉冲编码调制)、iLBC编解码、opus(声音编码格式)、VP8视频压缩格式、H.264数字视频压缩格式
目录 PCM(脉冲编码调制) 发展史 工作原理 iLBC编解码 基本介绍 技术优势 Opus(声音编码格式) 特性 播放 技术细节 VP8视频压缩格式 简介 突破创新 技术分析 H.264数字视频压缩 ...
- 实时音频编解码之十六 Opus解码
本文谢绝任何形式转载,谢谢. 第五章 Opus解码 理论上而言,编码的逆过程就是解码,如果理解了第四章编码的内容,这里叙述解码过程显得有所多余,但是笔者在理解Opus编码原理的时候,发现编解码交叉多轮 ...
- 移植Opus音频编解码库到FreeScale iMX6q(飞凌嵌入式的OKMX6Q-C开发板)平台
移植Opus音频编解码库到FreeScale iMX6q(飞凌嵌入式的OKMX6Q-C开发板)平台 交叉编译器 使用飞凌提供的最新版交叉编译工具链,fsl-imx-x11-glibc-x86_64-m ...
- AV1:为互联网提供开放、免费的视频编解码工具
从学术研究到进入工业界,Zoe Liu一直在算法和音视频领域,目前在谷歌编解码团队为编解码器AV1做开发支持.Zoe畅谈了评定编解码器的标准,以及AV1的最新进度.本文是『下一代编码器』系列采访之一, ...
- 视频技术详解:语音编解码技术演进和应用选型
本文来自现网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack整理而成.分享中刘华平以时间为主线,讲述了语音编解码技术的演进路 ...
- WebRTC 中收集音视频编解码能力
在 WebRTC 中,交互的两端在建立连接过程中,需要通过 ICE 协议,交换各自的音视频编解码能力,如编解码器和编解码器的一些参数配置,并协商出一组配置和参数,用于后续的音视频传输过程. 对于音频, ...
最新文章
- JS(JavaScript)的深入了解1(更新中···)
- html svg波浪,svg+css3做一个动感的波浪效果实现
- JavaScript 中创建三种消息框:警告框、确认框、提示框
- Mac中Finder是什么?怎么打开?
- KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)
- centeros php,CenterOs7 安装oracle19c的方法详解
- 《java入门第一季》之面向对象(static关键字内存图解)
- 联想thinkpadE14 vm蓝屏问题解决
- nandflash地址的物理地址,逻辑地址,spare地址等理解
- docker里面什么emule比较好_emule 服务器优先
- 用 Python 做股市数据分析(2)
- Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
- 爸爸给女儿存了一份养老险,女儿50多岁时可以领取30多万
- 伺服驱动器的工作原理及伺服驱动器的常见接线方法
- H.266/VVC技术学习:算术编码
- 国产数据库mysql_国产的数据库都有哪些?
- 数据蛙恢复软件替代产品有哪些?15款顶尖数据恢复软件清单
- 技术报告 | 罗汉堂:理解大数据:数字时代的数据和隐私2021.pdf(附下载链接)
- 分数拆分(简单数学)
- 卡巴斯基KAV KIS6.0激活码大全
热门文章
- iOS SDWebImage详细介绍
- ZN-1AI工业机器人与智能视觉系统应用实训平台
- python基于pingouin包进行统计分析:使用tost函数执行独立双样本双单侧检验(TOST)、以dataframe的形式输出分析结果(包含p值、自由度、bound等)
- mysql备份表语句
- window系统使用 bash 新建 vue3+ts 项目以及 preset 模板使用
- 二维vector的创建
- 14.二维数组:什么是二维数组???
- 主成分分析(PCA)与K-L变换
- SpringBoot实现文件单文件上传、批量上传、下载
- linux安装.rpm包及rpm命令