阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持
LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理。另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误。本文为 QoS 弱网优化系列的第三篇,将为您详解阿里云 RTC QoS 策略中的 LTR 抗弱网原理与实现硬解 LTR 时遇到的坑及其相应解法。
作者|安基程、陶森柏、田伟峰
审校|泰一
Long Term Reference (LTR) 抗弱网原理
参考帧丢失的 I 帧恢复
在 RTC 场景下一般的编码参考策略是向前一帧参考(在不考虑 temporal svc 的情况下),因为一般情况下参考距离越近,相似性越好,则压缩效果越好,出于实时的考虑编码只有 I 帧和 P 帧,没有 B 帧。在有 P 帧丢失的场景下,接收端需要重新请求 I 帧才能继续正确的解码和播放。

如上图所示,正常的 I P P P 帧编码,如果发生弱网导致中间的某个 P 帧(️ 标记)丢失,无法恢复,则接收端会请求发送端重新编码 I 帧,然而 I 帧只能使用帧内预测,所以编码效率低下。
参考帧丢失的 LTR 恢复
长期参考帧是一种可跨帧的参考帧选择策略,这种策略打破了传统的向前一帧的限制,可以更加灵活地选择参考帧。长期参考帧策略的目的是在有 P 帧丢失的场景下,接收端不需要重新请求 I 帧也能继续正确的解码和播放,其相对于 I 帧可以明显提升编码效率,节省带宽。该技术可以绕过丢失的帧,利用丢失帧之前的一个已经接收的长期参考帧作为参考进行编码 / 解码显示,从而提升弱网场景下的视频流畅性。

上图所示是引入 LTR 技术后的丢帧恢复策略,未发生弱网时仍然是正常的 I P P P 帧编码,只是会将其中的某些 P 帧标记为 LTR 帧(如图中的绿色 P 帧,以下称为 LTR 标记帧)。如果发生弱网中间的某个 P 帧(️ 标记)丢失,无法恢复,则接收端会请求发送端(编码器)利用 LTR 恢复,此时编码器会利用之前的已经确认收到的 LTR 标记帧做为参考编出一个 P 帧(图中红色 P 帧,以下被称为 LTR 恢复帧)。
由于之前的 LTR 标记帧已经被解码器确认收到,所以解码器参考帧 buffer 中必然存有此帧,所以利用此帧做参考的红色 P 帧必然可以被解码器正确解码。LTR 恢复帧由于是有参考的 P 帧,所以比 I 帧的编码效率显著提升。
根据上述 LTR 技术的特点和目的,可见 LTR 技术是一种网络模块和编码器共同配合完成的参考帧选择技术。实现 LTR 技术需要有接收端侧反馈信息,即编码器发出的 LTR 标记帧(图中的绿色 P 帧),如果被解码器成功收到,需要解码器
通知编码器其收到了这一帧,这样编码器在收到 LTR 恢复请求的时候,才可以 “放心的” 使用此帧做参考。
关于 LTR,前两篇文章中也有做部分介绍,感兴趣的读者可以参考:
1.《阿里云 RTC QoS 屏幕共享弱网优化之若干编码器相关优化》
硬件解码支持 LTR
硬件解码的优势
硬件解码相对于软件解码而言,具有低功耗的天然优势,所以,在有条件使用硬件解码且不影响视频观看体验的情况下,应首选硬件解码。
获取码流中的 LTR 相关信息
对于软件解码器而言,开发者可以直接在解码器中实现接口以从码流中读取 LTR 相关信息,比如此帧是否为 LTR 标记帧,及其 frame number 等信息。如果此帧是 LTR 标记帧,则将其 frame number 反馈给编码器以表示其已收到此帧。
然而对于硬件解码器,其接口软件开发者是无法修改的,一般硬件解码器也没有接口可以读取 LTR 的相关信息。那怎样才能读取到 LTR 的相关信息呢?
本文使用的方法是,在硬件解码器之外的 RTC level 再进行一次码流解析,读取 LTR 相关信息,反馈给编码器。由于该信息都在码流的 high level syntax 中,如 slice header 等,所以额外解析该部分码流并没有太大开销。
某些硬解不支持 LTR 及解决思路
由于 LTR 的上述功能并不是 codec 中特别常用的功能,所以一些硬解厂商并没有将 LTR 功能实现的很好,在本文的实测过程中,就发现了一些问题。

上图中如果红框中的普通 P 帧没有被丢失的话,则 LTR 恢复帧即红色 P 帧都可以被本文所测试的硬件解码器正确解码。但是如果红框中的 P 帧丢失了,则有一部分硬件解码器无法正确解码出后面红色的 LTR 恢复帧。本文实测了一些手机,发现使用苹果,高通,三星芯片的手机可以正确的解码,然而使用华为(海思)、联发科某些芯片的手机则不能正确解码此时的 LTR 恢复帧,会返回解码错误或输出花屏。
由于实际发生弱网的时候,肯定会伴随着丢帧,即红框中的 P 帧肯定会有所丢失,所以若此时 LTR 恢复帧不可解码,则就等同于 LTR 技术对于这些硬解不可用了。这应该是某些硬件解码器自身实现的问题,即没有完全按照标准去实现所致。但是要如何规避这种问题呢?
进一步测试发现,解码错误的原因是由于中间红框里面的 P 帧丢失导致 frame number 不连续,如果将后面帧的 frame number 改为连续的,则仍然可以正确的解码!所以,本文的解法是:对于一帧码流,在送给某些硬件解码器之前,如果发现其 frame number 和之前的是不连续的,则直接改写码流将其改为连续的,再送给硬解,这样,就可以很好的规避某些硬解无法解码 LTR 恢复帧的问题,从而兼顾功耗和弱网视频体验。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。
阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持的更多相关文章
- 阿里云 RTC QoS 弱网对抗之变分辨率编码
本文为 QoS 弱网优化系列的第二篇 作者|安基程.田伟峰 审校| 泰一 视频编码中的变分辨率问题及解决 变分辨率在弱网场景的实际应用中非常常见,网络状况不好的时候降低分辨率可以降低码率,减少块效应, ...
- 阿里云 RTC QoS 屏幕共享弱网优化之若干编码器相关优化
屏幕共享是视频会议中使用频率最高的功能之一,但在实际场景中用户所处网络环境复杂,常遇到丢包或者拥塞的情况,所以如何优化弱网环境下的用户体验也成为了音视频通信中重要的一环.本文主要分享阿里云 RTC Q ...
- 网络QoS的平衡之道——音视频弱网对抗策略介绍
作者:网易智企云信资深音视频引擎开发工程师 王兴鹤 随着AI和5G的到来,音视频应用将变得越来越广泛,人们对音视频的品质需求也越来越高,视频分辨率已经从高清发展为超高清.VR,视频帧率也已出现60fp ...
- 【阿里云服务器】外网无法访问tomcat下部署的项目
问题提出:在ESC实例上部署了jdk和tomcat(略,上云了,上云了),启动tomct后,内网可以访问8080端口,外网无法访问8080. 系统环境:winsdow 2008 企业版 解决方案: 在 ...
- 阿里云apache服务器外网无法访问(配置安全组,添加80服务)
CentOS的系统 ,已经安装好了 apache php mysql 常规排错过程(ps:没耐心的童鞋请直接看最后一步,学习在阿里云控制台配置 安全组,允许 http服务) 第一步:检查apache ...
- 阿里云HBase推出普惠性高可用服务,独家支持用户的自建、混合云环境集群
HBase可以支持百TB数据规模.数百万QPS压力下的毫秒响应,适用于大数据背景下的风控和推荐等在线场景.阿里云HBase服务了多家金融.广告.媒体类业务中的风控和推荐,持续的在高可用.低延迟.低成本 ...
- 通过rinetd实现端口转发,同时访问阿里云RDS的内外网
配置方法如下: 1 wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...
- Navicat通过云主机内网连接阿里云RDS
背景 公司为了安全起见,RDS设置只允许阿里云主机的内网端可以访问.这就意味,如果要操作RDS就需要连接到云主机上之后通过mysql shell操作.操作起来很复杂麻烦,今天看同事用Navicat f ...
- 阿里云内网和公网NTP服务器和其他互联网基础服务时间同步服务器
阿里云为云服务器ECS提供了内网NTP服务器,对于阿里云以外的设备,阿里云同时提供了 公网NTP服务器,供互联网上的设备使用. 内网和公网NTP服务器 以下为阿里云提供的内网和公网NTP服务器列表. ...
随机推荐
- SpringBoot2.x整合Email并利用AOP做一个项目异常通知功能
因为不知aop能干嘛,因此用aop做个小功能,再结合最近学的springboot-Email做了个系统异常自动邮件通知的功能, 感觉满满的成就感. AOP不懂的可以看上一篇:https://www.c ...
- Newbe.Claptrap 框架入门,第二步 —— 创建项目
接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...
- Java获取微信公众号新增用户事件
一.新建项目工程 新建一个spring项目 填写 Group 和 Artifact 信息 这步可以直接跳过,后面再按需导入 选择工程地址 二.配置 pom.xml <dependencies&g ...
- 后端程序员之路 44、Redis结合protobuf
protobuf序列化速度不错,在往Redis里存对象时,用protobuf序列化可以节省内存,省去写序列化反序列化代码的工作. google protocol buffer 与 redis 结合使用 ...
- Git:版本库建立与状态查看
版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可 ...
- 将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下)
将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下) 前面淘了一个蜗牛星际的矿机,打算拿来做个个人云盘,就装上了Linux用smb把硬盘共享出来 访问倒是很爽,就是发现下东西 ...
- WeihanLi.Npoi 1.16.0 Release Notes
WeihanLi.Npoi 1.16.0 Release Notes Intro 最近有网友咨询如何设置单元格样式,在之前的版本中是不支持的,之前主要考虑的是数据,对于导出的样式并没有支持,这个 is ...
- 漫漫Java路1—基础知识—初涉java
前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...
- 安装VMTools失败的三类解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- IPFS挖矿的成本有哪些?
IPFS作为区块链新贵,近来风头一时无量.截止3月9日,Filecoin以257亿的流通市值超越门罗币,稳居区块链流通排行榜. 无论什么投资,其门槛一定在成本.今天就和大家细说投资市面上常见实体矿机的 ...