用Elevator优化AV1视频播放

简介: AOM会员Vimeo通过Elevator改善AV1解码过程中的丢帧和质量下降问题。感谢Google软件工程师姜健对本文做的技术审校。

文 / Raphaël Zumer


译 / 刘俊


技术审校 / 姜健


原文


https://medium.com/vimeo-engineering-blog/enhancing-av1-playback-with-elevator-6a2991c1aac0


作为AV1编码标准的早期使用者,为了给Vimeo网站的用户带来更好的视频观看体验,我们需要开发诸多处理方案。其中有一种方案,取名为Elevator,是一个能在AV1格式视频码流中设置尽可能最低的编码等级的工具。在解码器端无法判断视频编码等级的时候,这种处理能优化播放过程中丢帧和视频质量下降的问题,在当前以及将来保证尽可能多的设备能够解码播放我们的视频内容。


Elevator工具在2019年9月公开发布,并且于当月在日本东京举办的视频技术开发日大会上首次展示。在这篇文章中,我们将介绍一些AV1格式的背景知识;结合一些例子来介绍Elevator是如何工作的;并分享我们在开发过程中的所思所得。


理解AV1格式的编码等级


AV1格式的编码等级是一组视频码流参数约束,一般每帧或每秒计算所得,包括码率、帧率等。从MPEG-2发布以来,编码等级的概念就存在于每一个当今常用的视频编解码器中。据编码等级规范约定,给定等级的解码器必须能够解码符合该编码等级的码流。视频编码等级使那些低功耗、解码能力有限的设备能够能够提供性能保证,在不牺牲用户体验的前提下,提前确定是否能正常播放给定码流。


在AV1和其他编码标准中,视频的编码等级参数在编码的早期阶段就已经确定了。对编码器而言,为准确设定等级有如下三种方式可用:


  1. 将等级参数设置为可能的最大值(对码流参数无约束)


  1. 在编码时收集数据,将数据返回到包头,最终获知准确的编码等级(这种方式不适用于某些部分编码过程,比如直播)


  1. 编码之前设定编码等级,在整个编码过程中严格执行该等级约束。


编码器也可以尝试预估得到准确的编码等级并且有一定的成功率。但由于不可预测的码率突增,这种方法不可能每次都输出有效码流。如下图中示例,Elevator工具为Chimera AV1格式的示例视频计算得到的编码等级就比由libaom参考编码器在编码时设置的可能的等级要高。

image.png

我们在Vimeo网站上编码AV1视频使用的编码器,rav1e,采用上述方法中的第一种。虽然这是最简单的,但是其前向兼容性并不够理想。我们希望高编码级别的码流不会被错误地送到只能解码低编码等级的低功耗设备上,于是我们开发了与rav1e不一样的Elevator,用于分析已编码的视频,设置准确的编码等级。


Elevator能做什么?


Elevator是一个用于计算AV1格式视频编码等级相关参数的开源命令行工具。这个工具计算码流所符合的最低编码等级,将该值输出在命令行窗口,也可以直接将其设置到视频流或新文件中。


尽管我们使用Elevator去降低Vimeo网站上被高估的编码等级,在编码器无法有效地约束视频的编码等级的时候,Elevator的表现也很出色。比如,我们根据Elevator计算结果反馈,逐步调整参数去重新编码视频内容,最终可得到足够低的编码级别。


为了充分利用Av1parser(开放多媒体联盟的AV1视频解析器),Elevator采用Rust语言编写。据我们所知,Av1parser在开发的时候是唯一独立的AV1码流解析器。由于计算编码等级参数所需信息的有些内容被封装在码流中间的包头中,编写我们自己的解析逻辑困难又耗时。我们对Av1parser做了很少一些改造,将这些问题的处理交给Av1parser,这样我们就少编写了很多用于分析复杂的AV1码流的代码。Elevator中唯一需要的位计数和位操作是在处理结束时将视频的编码等级设置为正确值。


由于某些码流特性以我们尚未支持的方式影响着参数的计算,Elevator尚不支持所有的AV1格式视频。到目前为止,Elevator只支持处理IVF容器封装的视频。在此,我们特别欢迎任何对该项目感兴趣的人在本项目GitHub上贡献缺陷报告、功能建议,或者上传补丁。


Elevator做了什么


Elevator的使用可以高度概括为两个步骤:分析和修补(后者是可选的)。修补步骤相对简单,因为编码等级参数被设定在AV1码流序列头的开始部分。在分析过程中,我们把序列头的位置记录下,以方便后续再次查找;然后,统计等级信息在码流序列头部中的偏移字节数,确保在准确的位置对编码等级进行编辑。


下图为分析的处理流程图:

image.png

图 1 分析步骤流程图


在处理完容器的数据后,Elevator进入分析的主循环:对视频中的每个OBU进行解析,每当遇到时间分隔符则保存下每帧内容的帧大小、头部数目等相关信息(OBU,即Open Bitstream Unit,开放比特单元,是AV1格式数据的最小划分单元)。


在分析阶段的最后,根据主循环更新迭代每帧内容得到的参数最大值,计算编码等级。然而,等级参数的定义并未统一,或是以每帧,或是以每秒计算。正因为如此,在AV1规范中没有明确定义该如何计算等级参数。在开发过程中我们得到的一些或许可行的计算方法如下:


  1. 统计每帧的指标,将结果缩放至以秒为度量;


  1. 统计每秒的指标,向下取整到最接近的帧数;


  1. 统计每秒的指标,向上取整到最接近的帧数;


我们发现,计算每帧的参数再将结果进行缩放处理会由于参数的尖峰异常值而得到与实际不符的编码等级。因此我们换了个方法,同样使用每帧的数据来更新参数,但使用每秒视频的多帧数据为组进行计算。如果帧率非整值,则对数据作向上取整处理,例如,对于帧率为23.976fps的视频,取24帧为一组。为抵消由于向上取整导致的计算偏差,我们会将结果适度缩小,比如,在23.976fps的情况下,将结果乘以23.976/24。


在实验过程中,我们发现相当多不太规范的AV1格式视频(如上面提到的Chimera的示例视频),其编码等级低于Elevator的计算值。如果Elevator计算的结果是正确的,这意味着在其他平台可能发布了大量不符合AV1编码规范的视频。不幸的是,目前并没有验证AV1编码等级正确性的公共测试序列。我们希望随着越来越多的硬件解码器在市场上发布,人们会更加关注正确标注视频编码等级的问题,产生更多能相互验证的解决方案或工具。


参考链接


Chimera的示例视频


http://download.opencontent.netflix.com.s3.amazonaws.com/Chimera/Chimera_DCI4k2398p_HDR_P3PQ.mp4


libaom参考编码器


https://github.vimeows.com/gist/raphael-zumer/d9fd0419827b64da1554e70b93de46f5


rav1e项目


https://github.com/xiph/rav1e


av1parser项目


https://github.com/yohhoy/av1parser

————————————————

版权声明:本文为CSDN博主「LiveVideoStack_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/103626046


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

阿里云视频云@凡科快图.png

相关文章
|
关系型数据库 MySQL Go
MySQL数据库安装(超详细完整步骤)
MySQL数据库安装(超详细完整步骤)
2094 1
|
存储
【期末计算机组成原理速成】第四章:输入输出系统
【期末计算机组成原理速成】第四章:输入输出系统
746 0
|
8月前
|
知识图谱 索引
GraphRAG进阶:基于Neo4j与LlamaIndex的DRIFT搜索实现详解
微软GraphRAG是早期成熟的图增强检索系统,融合实体、关系与层级社区摘要,支持宏观主题问答。本文重点介绍其DRIFT搜索策略:通过HyDE生成假设答案,结合向量检索与知识图谱动态遍历,先全局后局部,多轮迭代挖掘细粒度信息,平衡效率与质量,显著提升复杂查询的响应能力。
387 6
GraphRAG进阶:基于Neo4j与LlamaIndex的DRIFT搜索实现详解
|
9月前
|
人工智能 自然语言处理 算法
数字人|数字人平台推荐与选择指南
数字人企业正引领未来产业变革,像衍科技依托顶尖科研实力,构建全链条技术壁垒,推动虚拟人在多场景落地。从技术突破到商业转化,数字人已迈入价值创造新阶段,重塑行业格局。
|
7月前
|
人工智能 开发工具 iOS开发
数字人又要变天了!十行代码调用电影级3D数字人,RK3566无GPU也能跑
魔珐星云是全球领先的具身智能3D数字人开放平台,让大模型拥有“身体”,实现语音、表情、动作的实时交互。通过一站式SDK,开发者可快速打造高质量、低延时、低成本的多端适配数字人应用,覆盖情感陪伴、虚拟IP、车载、机器人等丰富场景,开启具身智能新时代。
1415 2
|
8月前
|
机器学习/深度学习 搜索推荐 算法
Python大数据驱动的图书推荐与分析系统:从数据到智能决策的实践探索
在信息爆炸时代,图书推荐系统利用Python大数据技术,融合用户行为、图书元数据与外部动态,构建“内容+协同+深度学习”混合模型,实现精准个性化推荐。通过三层架构与算法创新,破解冷启动、小众书推荐等难题,助力每本书找到真正读者。
592 0
|
安全
电机控制中对地的处理
1.当电路中有电机时,尤其是电压比较高的电机,一定要将控制电和动力电的地隔离开。如果不隔离,电机一启动,控制电路就可能不正常,比如复位、通信不正常等。 2.如果是有单独的电机驱动,那么主控板和驱动器的地最好也分开,实在不行也可以共地。
813 0
电机控制中对地的处理
|
人工智能 持续交付 开发者
通义灵码:加速个人成长与团队协作的最佳实践
从首个AI代码助手——通义灵码公测至今已有一年。作为云服务商运维工程师,我通过使用通义灵码的个人版和企业版,体验到了其在项目启动、代码调试、团队协作等方面的强大功能。个人版的 @workspace 和 @terminal 功能帮助我快速上手新项目,企业版的 #team docs 和自动化工作流则显著提升了团队协作效率。以下是具体使用心得和案例分享。
1090 57
|
容器
文本溢出省略号text-overflow: ellipsis显示无效?这一属性到底该怎么用?
文本溢出省略号text-overflow: ellipsis显示无效?这一属性到底该怎么用?
714 0
|
弹性计算 Kubernetes 监控
阿里云ack学习
【8月更文挑战第6天】
2440 3