当前位置: 首页 > news >正文

走进音视频的世界——Opus编解码协议

Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时、带内FEC、DTX、PLC等特点,默认22.5ms延时,非常适用网络实时传输。官网:https://www.opus-codec.org。Opus协议收录于RFC6716,使用SILK和CELT两种编码。

目录

一、Opus特点

二、码率、音质、延时

1、音质与码率比较

2、码率与延时对比

三、Opus编解码框架

四、DTX非连续传输

五、FEC前向纠错

六、Opus解码

1、SILK解码器

七、PLC丢包隐藏


一、Opus特点

Opus在语音app应用很广泛,包括VoIP、视频会议、语音聊天、音乐直播演唱会等。即支持低码率语音,也支持高音质音乐。特点如下:

  1. 码率支持从6kb/s到510kb/s;
  2. 采样率支持从8kHz到48kHz;
  3. 可变帧长从2.5ms到60ms;
  4. 支持CBR和VBR两种码率模式;
  5. 音频带宽从窄带到全频带;
  6. 支持语音和音乐;
  7. 支持多达255个声道;
  8. 动态调整码率、带宽、帧大小;
  9. 支持PLC丢包隐藏;

二、码率、音质、延时

1、音质与码率比较

Opus、AAC、MP3、Vorbis等codec的质量与码率对比,如下图所示:

 由图可见,Opus的码率从6kb/s到128kb/s都是音质最高的,接着是AAC、Vorbis,而MP3是在128kb/s时取得不错音质。

2、码率与延时对比

Opus、AAC、Vorbis、MP3等codec的码率与延时对比,如下图所示:

 由图可见,Opus的码率从6kb/s到80kb/s时,延时都是最低的。接着是窄带的G729,超宽带的AAC-LD(低延迟模式)。而延时比较的是Vorbis、AAC、MP3,延时达到200ms左右。

三、Opus编解码框架

Opus的编解码框架包括:VAD静音检测、音调分析、预测分析、噪声整形分析、长期预测量化、线谱频率量化、增益量化。如下图所示:

四、DTX非连续传输

DTX,Discontinuous Transmission,用于检测静音传输时,自动降低码率节省带宽。前面提及的VAD模块就是用来静音检测。DTX适用于VBR和CBR码率模式,会稍微降低声音质量。因此,建议在网络带宽受限条件下,才开启DTX。

五、FEC前向纠错

FEC,Forward Error Correct,通过添加先前数据包的冗余数据到当前包,实现前向纠错。Opus允许带内的FEC。编码器觉决定是否使用FEC取决以下条件:

  • 外部提供信道丢包率估计;
  • 外部提供信道容量估计;
  • 语音或音乐对丢包的敏感度;
  • 解码器有没请求带内FEC信息;

发生丢包时,接收端可以根据FEC重建数据包。但是,每个数据包加上FEC导致数据量变大,所以FEC需要根据实际情况使用(比如丢包率达到一定程度)。

六、Opus解码

Opus的解码包括SILK和CELT两部分,在SILK端做采样率转换和延迟补偿,在CELT端做决策处理。如下图所示:

1、SILK解码器

SILK解码流程如下图所示: 

 对应序号的参数如下:

  1. 局部编码比特流;
  2. 编码参数;
  3. 脉冲、信号;
  4. 音调间隔,LTP系数;
  5. LPC线性预测编码系数和增益;
  6. 解码信号;
  7. 分离信号;
  8. 重采样信号;

七、PLC丢包隐藏

PLC,Packet Loss Concealment,是解码器可选模块。PLC依赖上一个接收到的数据包。在CELT解码模式,找出周期性的解码信号,使用音调偏移来重复窗口波形。窗口波形以如下方式重叠:保留时域混叠消除的上一个帧和下一帧。调用celt_decode_lost()函数实现。在SILK解码模式,使用上一帧的LPC插帧。

相关文章:

  • SaaS vs 低代码,谁在成为中国产业服务的楔子?
  • Redis实战精讲(3)
  • Flink(二)
  • 全息干涉图补零尺寸与三种重构方法重建像间的关系研究
  • Vue2(十三):路由的使用及注意点、嵌套路由、路由的query和params参数、props配置
  • 如何增强 ABAP 系统,允许开发人员给 ABAP 对象设置标签,方便快速检索
  • 【Python】面向对象 -没有对象?new一个吧
  • ELK集添加安全认证
  • 智能家居离线语音识别控制系统设计(SU-03T)
  • 商家如何玩好“种草神器”?小红书KOL达人种草这样做
  • 基于共词分析的中国近代史实体关系图构建(毕业设计:图数据渲染)
  • 猿创征文|阿里云MaxCompute存取性能测试报告
  • Spring Cloud Sleuth在分布式中进行日志跟踪
  • Jmeter分布式部署执行和常见报错
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • 3.7、@ResponseBody 和 @RestController
  • angular学习第一篇-----环境搭建
  • JavaScript创建对象的四种方式
  • MySQL QA
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Phpstorm怎样批量删除空行?
  • uni-app项目数字滚动
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Yeoman_Bower_Grunt
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端知识点整理(待续)
  • 学习JavaScript数据结构与算法 — 树
  • 异步
  • 你对linux中grep命令知道多少?
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云移动端播放器高级功能介绍
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​香农与信息论三大定律
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #if #elif #endif
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (分布式缓存)Redis持久化
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (转载)hibernate缓存
  • ***原理与防范
  • .form文件_SSM框架文件上传篇
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET MVC第三章、三种传值方式
  • .NET 分布式技术比较
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net6使用Sejil可视化日志
  • .net经典笔试题
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn