AV1的实时模式

news/2024/11/8 15:15:00/


不久前,Google Duo宣布将全面转向AV1。相比于VP9,AV1能够带来更好的编码效率,为用户提供更好的视频体验。本文来自Google软件工程师 姜健在LiveVideoStack线上分享的内容。 

文 / 姜健

整理 / LiveVideoStack

视频回放:

https://www.livevideostack.cn/video/av1-real-time-mode/

1

关于AV1

AV1编解码技术对视频质量有非常大的提高,尤其是在低码率和网络状态非常差的情况下,AV1编解码技术相对于VP9和H264编解码都有一个质的飞跃。

从图中明显可以看出,在码率为30kbps情况下,左图是AV1编解码技术处理效果,右图是Duo目前所使用的编解码技术的处理效果,对比质量差别很大。

 

在印度、巴西等一些发展中国家大多数人的网络接入情况较差,这些网络较差的地区正是谷歌最受欢迎的市场,所以Google Duo也在尽力提高低码率的视频质量,因此AV1技术对Duo来说有非常大的帮助。

关于AV1编码器的设定,图中最下端区域是可执行的命令行,一般使用该命令行测试手机或电脑上的速度,需要强调的设定有以下几点:

  • Profile必须设置为0;

  • Real-time的模式;

  • 在实时视频编解码时必须是1Pass

  • lag-in-frame必须设定0,目标码率必须恒定,若目标码率上下波动的起伏很大对网络的要求很高;

  • 最后比较重要的是速度设定必须大于等于6,目前我们有实时模式下6、7、8三个速度档,很多编码器的决策设定都需要根据CPU参数。

AV1的实时模式与VOD的区别有以下四点:

 

三个速度档:6、7、8。

  • 速度档6严格来讲与VP9的区别非常大,VP9的实时速度档使用的是Non-RD进行决策,因为RD ( rate-distortion)决策会很慢,但是在AV1中特意增加了速度档6,使用了RD(rate-distortion)优化来进行决策,因此速度档6的质量是最好的(速度越小质量越好)。

 

  • 速度档7、8使用Non-RD进行决策,Non-RD即使用其他算法进行快速决策。但是速度越快质量越差。

 

  • AV1对于720P以及更高清视频使用了最大128×128的区块,低分辨率视频使用64×64分区。如果视频分辨率太小使用128×128分区后,区块很少,会降低质量,但是对于高清视频来讲,使用128×128可以提高编码速度。分区使用Variance进行决策,在VP9中的基于方差分区 (Variance based partition)使用的是机器学习中的CNN训练模型,通过计算Variance与提前设定的阈值进行比较。

 

  • AV1中加入了SVC支持,并且在libaom的代码中放入了SVC示例,该SVC支持比VP9更加灵活。

 

  • AV1目前的SIMD优化还没有完全结束,实时编码速度在未来还有比较大的提升空间,暂时还未对一些函数进行优化,目前正在手机端进行NEON的优化。

 

2

测试成果

实时模式的优化主要是速度与质量的平衡。

手机端速度测试

首先进行了低码率50Kvps QVGA的测试,320×240及以下分辨率的速度6档可达到40-50帧每秒的传输速度,速度7档可达到150-190帧每秒,速度8可达到200-250帧每秒,均为单线程测试。

640×360或640×480的视频在500KbpsVGA进行测试,结果显示速度6档位的传输速度非常慢,速度7档可达到25-40帧每秒,速度8挡可达到40-60帧每秒的速度,同样均为单线程测试。

 

由于手机端诸多性能因素使用多线程测试数据不稳定,因此未进行大量多线程测试。

 

台式机的速度测试

台式机CPU参数如图中最下端所见,单线程测试,500Kbps VGA测试,速度档7可达到80-130帧每秒的传输速度,速度档8可达到120-265帧每秒的传输速度。

 

台式机上测试800Kbps HD的720P以上,单线程速度7挡的测试结果为35-45帧每秒,速度8的测试结果为40-70帧每秒,该速度较VP9差,因为AV1编码器的复杂程度较高,虽然速度较慢,但是视频质量高很多。

3

AV1编码器优势

如图为VP9与AV1区块划分的区别,VP9最大支持64×64区块,而AV1最大支持128×128区块。AV1中的区块存在边长比为1:4的长方形分块,这种情况很少见,在实时编码器不考虑搜索该区块,比VP9灵活很多。

 

AV1编码器的算法复杂度虽然高但是搜索空间大,视频质量提升很多。

在视频编码之前,首先对原视频进行分析,即原视频的SAD(绝对误差和)和variance(方差),使用这两个数据跳过一些模式的选择,例如在计算运动向量(motion vector)时需要搜索很多模式,使用SAD和varance两个数据与阈值比较,可以跳过运动向量的一些模式选择,另外在帧内编码时,帧内模式的一些搜索也可以通过这两个数据简化。

 

手机端对SAD(绝对误差和)和variance(方差)的计算进行了优化,因此运算速度很快。

VP9只支持固定256像素宽度的块,当出现分辨率较小的帧例如640×480等,最多只能使用两个区块做并行。但是AV1在这方面很灵活,720P分辨率以上的最大区块单元是128个像素宽度,720P以下为64像素宽度,因此可以根据情况灵活增加区块,以进行多线程操作。同时,AV1与VP9都支持多行并行处理。另外AV1的解码器可以只解码特定区域,例如某一个区块为64像素宽度,可以要求解码器解码其中某一部分,这样当用户对视频的某一部分感兴趣时就可以只解码该部分。

 

图中最下边的文献是对AV1编码工具的综述,文中指出720P分辨率使用4个线程且进行4块区分,有3倍的速度提升。

当实时视频的前后两帧的变化很大时,码率会突然升高,帧的尺寸会突然变化很大,对网络是很大的压力,导致视频质量突然变差,因此AV1编码器会每隔一个最大区块计算时域SAD与前一帧作比较,若该时域SAD非常高,编码器即认为发生很大变化,就使用更高的QP,缩小该帧的尺寸,以降低网络压力。

AV1编码器会通过计算时域的方差简化模式选择。

SVC的AV1设定(比VP9直观很多):其中有三个变量:参考帧(设定不同分辨率的参考帧位置)、当前帧刷新哪一个缓存、模式设定,AV1的设定直接将所有的控制权交给用户,用户需要哪种模式即可设置哪种模式。

 

4

AV1编码器的未来

目前AV1正在开发WebRTC支持,很快会推出。

由于AV1编码器的复杂度远远高于VP9,因此在产品中较大的缺点是编码之后的尺寸是VP9的几倍,进行很多优化之后,例如去掉一些用不到的工具等,使编码后尺寸下降30%。

点击【阅读原文】或扫描图中二维码,了解更多讲师及话题信息


http://www.ppmy.cn/news/428332.html

相关文章

Bilibili支持了AV1编码,关于AV1编码你知道吗?

Bilibili支持了AV1编码,关于AV1编码你知道吗? AV1编码是一种新的视频编码标准,由联合开发的开源编码器,它由英特尔、微软、谷歌、苹果、Netflix、AMD、ARM、NVIDIA和其他一些公司共同开发,旨在替代H.264和HEVC等现有的…

av1 学习资料

1.技术简介,博客地址:AV1编码技术详解_FeelTouch Labs的博客-CSDN博客_av1编码

iOS】AVPlayer 播放音视频

1、常见的音视频播放器 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是,AVAudioPlayer 只支持本地音频的播放,而 AVPlayer 既支持本地音频播放,也支持网络音频播放。 常用的视频…

AVAudioPlayer音频播放器—IOS开发

IOS中有三种播放音频的方式:AVAudioPlayer、音频服务、音频队列。 此文主要讲AVAudioPlayer,其他两个请见相关文章。 AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。 AVAudioPlayer类封装了播放单个声音的能力…

【iOS】AVPlayer 视频播放

视频播放器的类别 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是,AVAudioPlayer 只支持本地音频的播放,而 AVPlayer 既支持本地音频播放,也支持网络音频播放。 常用的视频播放…

AVB简介--第三篇:AVTP简介

转自:AVB简介--第三篇:AVTP简介 本文是AVB系列文章的第三篇,主要介绍AVB协议族中的音视频传输协议AVTP(IEEE Std 1722-2016)。 AVTP是个链路层传输协议,其主要作用有两个: 音视频数据封装:将音视频数据封…

AVFoundation(一)

AVFoundation是可用于播放和创建基于时间的视听媒体的几种框架之一。它提供了一个Objective-C接口,您可以使用该接口详细处理基于时间的视听数据。例如,您可以使用它来检查、创建、编辑或重新编码媒体文件。您还可以从设备中获取输入流,并在实…

ios 视频播放器:AVPlayer(附:seektotime精准定位)

Swift 3.1{ func playVideo() {var playerItem AVPlayerItem(url: movieURL as URL)// 创建 AVPlayer 播放器var player AVPlayer(playerItem: playerItem)// 将 AVPlayer 添加到 AVPlayerLayer 上let playerLayer AVPlayerLayer(player: player)// 设置播放页面大小player…