有的放矢,远程操控中实时音视频的优化之道
5G远程操控场景,对实时音视频传输的时延、卡顿率和抗弱网等指标都有着非常高的要求,本文将会介绍如何结合5G网络特点,在实时音视频通信链路中进行联合优化,满足行业场景远控需求,降低画面时延。
在上一篇文章中,我们介绍了远程操控的技术要点。从这一章开始,笔者将会依次介绍远程操控三大技术的应用及优化重点内容。本文就将会以实时音视频通信技术开始,其主要被用于解决远程操控中被操控设备或车辆周边环境画面和声音向远处控制端的实时传输,方便远程驾驶员或操控员能够清晰地了解被控设备周遭情况,从而进行针对性操控。比如车辆前进中前方和侧后方的画面,挖掘机作业过程中的抓臂画面都需要通过实时音视频技术进行远程传输。
为保证操控的实时性和流畅性,相比声音的传输,远程操控主要对画面的传输有非常高的要求,针对画面时延、卡顿率和抗弱网能力等核心指标更是如此。以低速远程驾驶场景为例,时延需要小于200ms, 尽量能接近100ms,卡顿率最好低于千分之2,能够抵抗极端情况下与平均RTT时延相当的网络波动和20%-30%左右的丢包率。这些指标的要求往往明显高于此前的远程会议、直播、监控等应用场景,而对于实时音视频技术来讲,降低时延,与降低卡顿率、提高抗弱网能力往往是相互矛盾的,因此这是一个非常大的挑战。
远程操控与其他应用场景的指标对比
按图循迹,探索优化重点
下图是一个典型视频传输链路的示意,主要由采集、编码、发送、传输、接收、解码、渲染等主要模块构成。
典型视频传输链路示意图
采集:从相机中采集出原始的图像帧数据
编码:对采集的原始图像帧进行编码
发送:对编码后的视频帧进行打包发送
传输:将打包后的数据从网络中传输
接收:接收打包数据并恢复出视频帧
解码:对视频帧进行解码恢复出原始图像帧数据
渲染:对原始图像帧数据进行渲染输出到屏幕
实时音视频通信中,主要承担抵抗网络波动、降低卡顿率责任的是接收模块中的jitterbuffer,同时它也是时延的主要贡献者之一。不同项目中jitterbuffer的实现略有区别,但基本上都会有乱序排列、帧检测、帧缓存等功能。jitterbuffer主要负责正确接收视频帧并适当缓存,在确认达到可解码条件后,根据预估的帧间延迟(两帧接收时间差-两帧发送时间差)平滑后,送入到后续的解码和渲染模块。这样即使网络有一定波动,由于jitterbuffer的平滑,相邻的视频帧仍可以接近期望时间间隔渲染,从而流畅播放。通常为应对丢包、乱序和时延抖动,网络RTT和时延抖动越大,需要的jitterbuffer也越大,这时由于缓存的增大,视频时延也会相应增大。这就是三大指标之间矛盾的根本由来。
除了接收模块外,我们再看看其他模块的情况。随着芯片计算能力日益提升,编码、解码、渲染等模块的时延已经很小,基本都在10ms以内,甚至可以做到5ms左右,可优化空间不大,对三大核心指标影响较小。采集和传输模块的时延,主要受外部客观条件影响,前者取决于相机,后者取决于网络。发送模块会对数据传输的丢包、时延和抖动产生影响,从影响接收效果。因此为达到三大核心指标,需要做出针对性优化地主要是发送和接收模块。通过发送模块的优化,在保证卡顿率和抗弱网能力的基础上,尽量降低接收端jitterbuffer的大小,从而降低时延。
有的放矢,设计优化方案
对于发送和接收模块的联合优化,不同项目的实现不尽一致,复杂程度和效果相差也较大。下面是一个实时音视频通信架构中较为复杂的发送和接收模块实现示意。 腾讯远程操控产品中实时音视频通信也是使用了这样的构成。
发送和接收模块示意
发送模块主要由封包协议、拥塞控制、发送窗口、差错编码等构成,其中为提高传输的效率和抗弱网能力,封包协议通常都是基于标准RTP协议,底层采用UDP协议。拥塞控制主要是对网络状态进行估计,为发送pacing窗口和码率提出建议。差错编码,主要是为了抵抗RTP包的丢包,提高前向纠错能力,这样部分丢包可以通过差错解码进行恢复而不依赖重传。
接收模块中jitterbuffer涉及的乱序缓存、帧检测缓存和帧缓存外,还有拆包、差错解码、链路状态估计反馈等模块;其中链路状态估计反馈,主要是用来估计链路的丢包、时延和时延抖动等情况,用来指导jitterbuffer大小设计,并给发送端拥塞控制提供参考。
上面提到,优化的目的是降低jitterbuffer大小,而帧间时延波动是影响jitterbuffer大小的核心因素。除网络自身波动外,丢包重传是时延波动峰值的主要贡献者。因此发送和接收联合优化首先要考虑的是降低丢包重传。腾讯主要是在拥塞控制、差错编码上,针对5G远控场景做了更好的优化,降低了丢包重传的概率。
拥塞控制:目前常见的用于实时音视频的拥塞控制方法中,较好的有BBR、GCC等。
BBR主要是基于网络的时延带宽积,分别探测网络的最大带宽和最小时延,并认为两者乘积是网络上能够承载是数据最大容量,其优点在于可以抵抗随机的网络时延和丢包波动噪声,缺点在于最小时延测量时会降低吞吐,对于突发的网络恶化,需要更长的时间才能降到实际带宽。而且BBR最初不是针对视频传输设计,在实时音视频中的应用经验比较有限。
GCC是同时基于时延拥塞控制和丢包拥塞控制,并取两者最小值。在时延拥塞控制中,为平滑网络波动噪声对延迟梯度估计的影响,GCC中使用了卡尔曼滤波器来进行处理。GCC优点在于可以同时兼顾时延和丢包,并且有较好的实际应用经验。
差错编码:在网络传输中,丢包模型可以理解为是一个删除信道,数据包在传输中会被随机删除。因此可以使用适用删除信道的前向纠错编码(FEC),通过增加包传输时的冗余数量来恢复丢包。 考虑纠错性能和计算复杂度,音视频传输主要使用线性分组码,常用的有异或编码、RS码等。 由于FEC在设计时,主要是面向随机错误,在较短的编码长度(编码包数量)下, 这种方式可以抵抗一定程度的随机丢包。但对于拥塞或网络质量下降导致的突发丢包,较短编码长度仍无法抵抗,这时传统会通过增加包之间的时间间隔,并且增加编码长度,来抵抗突发丢包。
基于5G空口网络的优化增强
在5G远控场景中,网络时延中5G空口的时延和波动占比较大,而5G空口的网络模型与传统路由器有一定区别。 传统路由以拥塞丢包为主,自身不带重传; 5G空口差错丢包和拥塞丢包都有,自带一定重传;传统路由时延上升主要由拥塞导致, 5G空口由于资源调度周期,也会出现一定程度时延波动,特别是针对上行数据传输。5G空口的带宽跟信噪比和空口负载有关,会随时间变化;传统路由的带宽相对固定,主要受网络负载影响。
路由器与5G空口网络特点对比
拥塞控制的优化:可以看出5G空口网络与传统路由存在较大区别,面对资源调度周期引起的时延抖动和信号质量带来的带宽波动时, BBR拥塞控制适用性有限。考虑到5G空口中信号质量会导致网络带宽变化较大,因此可以在GCC时延、丢包拥塞控制的基础上,增加基于空口信干噪比和网络负载估计的拥塞控制,这样对于5G空口网络变化具有更快地反应速度。同时可以修改GCC中时延梯度估计用到的卡尔曼滤波算法,更好平滑资源调度周期带来的时延梯度抖动。
差错编码的优化:基于5G空口网络特点,可以看出 5G空口由于自身带重传,丢包发生概率较少,可以使用较短的编码长度抵抗随机发生的丢包。 5G空口中突发丢包的产生往往是由于5G空口信号质量下突然下降导致,这种深衰落的周期通常跟移动性有一定关系,移动速度越快,周期越短,低速移动时在10ms左右。传统的通过简单引入更长包间隔和增加编码长度的方式无法有效应对,而且会增加发送数据量,导致丢包恶化。配合基于空口信干噪比的拥塞控制估计,可以即时预知这种突发丢包,通过降低码率,延长发送时间,而不增加编码长度,减少突发丢包概率。同时可以引入分组交织的方式,将编码进行交织,一定程度抵抗突发的丢包。
总体上,5G远控场景对音视频的时延要求是非常高的,虽然通过结合5G网络特点,在发送和接收进行了一些联合优化,可以满足一些中低速行业场景的远控需求,但是离行业理想的100ms指标还是会有一些挑战,特别是在跨区域的远控场景。未来还需要更多地引入结合网络的一些联合优化的手段,另外也可以考虑在相机采集、编码上进行更多的挖掘,以尽量提升端到端效果。
相关文章:

Quartz动态添加、修改和删除定时任务
2019独角兽企业重金招聘Python工程师标准>>> Quartz动态添加、修改和删除定时任务 转载于:https://my.oschina.net/haokevin/blog/1795161

Linux下运行run文件
必须到Linux下的终端,不能用远程命令 #chmod 755 文件名 #./文件名

第五届中国企业服务年会:洞见2022数智化的“光与火”
汇智聚能,一起点亮“高增长的下一步”。 在疫情防控与复工复产双重因素的带动下,企业数智化成为不确定环境中的确定项,“ABCD(人工智能、区块链、云计算、数据)X”引爆生产力、生产资料、生产关系和基础设施革命&#…

QTP连接oracle
2019独角兽企业重金招聘Python工程师标准>>> 首先,因为群里很多朋友说QTP连接oracle有点麻烦,我针对于连接oracle做一个完整的教程,希望需要学习的朋友都可以来看一下;具体方法如下: 1、无论是什么语言&am…

java子类对象和成员变量的隐写方法重写
1、子类继承的方法只能操作子类继承和隐藏的成员变量名字类新定义的方法可以操作子类继承和子类新生命的成员变量,但是无法操作子类隐藏的成员变量(需要适用super关键字操作子类隐藏的成员变量。) public class ChengYuanBianLing { publi…

Linux的cron和crontab定时任务
定时任务调用shell本地Windows写一个shell test.sh #!/bin/bashecho "Course Arrange Job runs well at: " date "%Y-%m-%d %H:%M:%S" >> /usr/www/wwwshell/www.txt 先在服务器执行看可不可以 注意需要 # dos2unix ./test.sh 再 # ./test.sh需要…

用AI创造可持续发展社会价值,第二届腾讯Light·公益创新挑战赛正式启动
12月23日,“创变者”2021年度腾讯Light论坛在厦门正式举办。在论坛上,由全国妇联宣传部指导,腾讯公司联合中国儿童中心主办,企鹅伴成长、腾讯华东总部、腾讯SSV创新办学实验室、企鹅爱地球、腾讯优图实验室、腾讯云AI、腾讯云微搭…

CSS3 @keyframes animate
2019独角兽企业重金招聘Python工程师标准>>> 1.keyframes定义和用法 通过 keyframes 规则,您能够创建动画。 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。 在动画过程中,您能够多次改变这套 CSS 样式。 以百分比来…

linux系统命令学习系列-文件和目录管理
复习上节内容:1. 定时执行任务命令crontab –e, crontab –l,crontab –r2. 作业:定义一个定时任务,每分钟向/tmp/test.txt文件输出hello worldcrontab –e*/1 * * * * echo ‘hello world’>>/tmp/test.txt本节我们来说一下文件和目录…

GPT-3再进化:通过浏览网页来提高事实准确率
作者 | OpenAI来源 | 数据实战派为了让 GPT-3 模型可以更准确地对开放式问题进行回答,研究人员使用了基于文本的网络浏览器对 GPT-3 进行微调。微调后的 WebGPT 模型可以对人类实时回答问题的方法进行学习,比如提交搜索、跟踪链接并上下滚动网页。研究人…

lamp-安装脚本-修订版2
#!/bin/bash #write by zhang_pc #at 2015.08.07 #apache2.4 php.5.4 mysql5.5 #脚本说明,如果脚本所在目录有源码包就用本地的,否则就从互联网下载APR_FILESapr-1.5.2.tar.gz APR_DIRapr-1.5.2 ARP_PRE/usr/local/apr APR_URLhttp://mirror.bit.edu.cn/…

Linux的rc.local自启动服务
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。本文中假设inittab中设置的init tree为:/etc/rc.d/rc0.d/etc/rc.d/rc1.d/etc/rc.d/rc2.d/etc/rc.d/rc3.d/etc/rc.d/rc4.d/etc/rc.d/rc5.d/etc/rc.d/rc6.d/e…

[日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用。 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数。 练习 5.3: 编写函数输出所有text结点的内容。注意不…

Centos下安装mysql 总结
一、MySQL安装 Centos下安装mysql 请点开:http://www.centoscn.com/CentosServer/sql/2013/0817/1285.html 二、MySQL的几个重要目录 MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件、配置文件和命令文件分别在不同的目录,了解这些目录…

Linux下的Memcache安装(含libevent的安装)
Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 。下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz另外,Memcache用到了libevent这个库用于Socket的处理,…

谷歌发布 RLDS,在强化学习生成、共享和使用数据集
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 大多数强化学习和序列决策算法都需要智能体与环境的大量交互生成训练数据,以获得最佳性能。这种方法效率很低,尤其是在很难做到这种交互的情况下,比如用真实的机器人…
浅谈 javascript 中的this绑定问题
javascript语言是在运行时前即进行编译的,而this的绑定也是在运行时进行绑定的。也就是说,this实际上是在函数被调用时候发生绑定的,它指向什么完全取决于函数在哪里被调用。1.默认绑定 例如直接在全局作用域下声明: var a2; console.log(this.a);在全局…

Centos用yum安装X Winodw
安装Centos 5.6系统的时候我没有先装任何组件,现在用X Window,需要再安装X Window,就可以启动图形界面了,但是默认的图形界面是很简陋的界面,可以根据需要再安装GNOME或KDE桌面环境安装X图形界面#可查询哪些组件是否已…

玩具javascript:cookie管理
2019独角兽企业重金招聘Python工程师标准>>> ;(function(window, undefined){var CookieUtil window.CookieUtil window.CookieUtil || {};var doc window.document;// 读取名称为name的Cookie信息CookieUtil.read function(name){// 暂无Cookieif(doc.cookie.l…

详解 Pandas 与 Lambda 结合进行高效数据分析
作者 | 俊欣来源 | 关于数据分析与可视化这篇文章小编来讲讲lambda方法以及它在pandas模块当中的运用,熟练掌握可以极大地提高数据分析与挖掘的效率导入模块与读取数据我们第一步需要导入模块以及数据集import pandas as pddf pd.read_csv("IMDB-Movie-Data.c…

前端工程师成长之多读好书
1 引言 乱七八糟的书看了很多,有一本讲JavaScript的印象特别深开篇说的是"JavaScript是Java的脚本语言",但还是看完了,最后忘了书名。 下面列的这些都是看过后至少记得起书名的,也有部分是经常看的书,一起列…

linux下配置vnc的方法
网上这样的文章很多了,好多前辈们都把自己的经验配置共享出来,受益匪浅,现在整理一下。 下面摘录的两篇文章各有侧重,结合起来可以配置的比较完善了。总结一下,只需要四步:step1 在当前linux系统用户us…

用 Python 画圣诞树的 N 种玩法
作者 | 写代码的明哥来源 | Pyhton编程时光马上就是圣诞节了,先提前祝大家圣诞快乐!今天来给大家分享一波如何使用 Python 来画一颗圣诞节树,包含多种版本,从平民版到豪华版,像极了一个程度员从入门到高级秃头程序员的…
ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL
前面的两篇文章中。我们对NHibernate已经做了大致了解 《ORM利器:NHibernate(一)简单介绍》Nhibernate的作用:攻克了对象和数据库的转化问题 《ORM利器:NHibernate(二)使用CodeSmith高速生成映射…

Linux学习笔记8——bash基本概念
一个操作系统的组成中,shell是与用户最接近的部分shell:外壳,也是一种程序GUI:Gnome,KDE,XfaceCLI:sh,csh,ksh,bash,tcsh,zshLinux中大多使用bash…

UIScrollView offset in UINavigationController
转:UIScrollView offset in UINavigationController 通过设置viewCtronller的 self.automaticallyAdjustsScrollViewInsets NO; 禁用苹果scrollview提供的自适应功能。 延伸阅读:https://developer.apple.com/library/ios/documentation/UserExperience…

AI 通过眼睛的反光度,来识别是否 Deepfake 换脸
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) Deepfake 是一种 AI换脸工具,现被滥用,从虚假宣传活动到插入一些违法内容,并且篡改后的图像是难以被检测到的。 一种新的 AI 工具提供了一项令人惊讶的简单方法来发现…

[异常笔记] spring boot 启动-2018040201
异常 1、编码引发异常 00:59:49.311 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : [] 00:59:49.318 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Excluded patterns for re…

maven基础概念学习1
2019独角兽企业重金招聘Python工程师标准>>> 1.maven是什么? 百度百科: Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 2.maven的作用? 构建、文档…

php session 二位数组
最普通的用法:一个变量名 $_SESSION[user] 0;echo $_SESSION[user]; 使用数组: $_SESSION[user][a] 1;$_SESSION[user][b] 2;echo $_SESSION[user][a];echo $_SESSION[user][b]; 这样的好处是可以分组可以 $_SESSION[admin][a] 11;$_SESSION[admin][…