草庐IT

H.266视频编解码标准

FFmpeg音视频 2023-10-21 原文

H.266多功能视频编码编解码器标准,新的H.266 /VCC编解码器在保持清晰度不变的情况下,数据压缩效率获得极大提高,数据量减少了50%。

新标准的公告中指出,由于改进了压缩技术,H.266将减少约50%的数据需求。使用之前的HEVC编解码器,传输一段90分钟的超高清(UHD)视频需要大约10GB的数据,而H.266只需5GB就可以做到这一点。

据了解,该编解码器为全新设计,主要用于4K和8K流媒体视频,它将允许用户存储更多的高清视频,并减少移动网络的数据量。

H.265/EVC编解码器是高效率视频编解码,而H.266/VVC编解码器为多功能视频编解码。

弗劳恩霍夫研究所视频编码系统负责人本杰明·布鲁斯(Benjamin Bross)表示,由于H.266/VVC提供了编码效率的飞跃,视频的使用量将在全球范围内进一步增加。此外,H.266/VVC的通用性增强,使其在与视频传输和存储相关的更广泛的应用中更具吸引力。

不过根据此前普及的速度来看,H.266的应用恐怕还需要些时间,2013年H.265标准制定,2017年才被苹果所支持。时至今日,有着将近20年历史的H.264仍被广泛应用。

有业内专家分析称,新H.266预计在2027年才会被广泛接受和使用。

作为国际标准,H.266/VVC的制定得到了世界知名公司的支持与参与。

  • 1、Microsoft(JVET的主席之一Gary J.Sullivan就职于微软,还有微软亚研的李斌博士)

  • 2、Qualcomm(高通的提案最多)

  • 3、Samsung(三星是H.264的赢家,提案很多)

  • 4、MediaTek(联发科提出来的QTBT编码结构做的很好)

  • 5、Intel(据说Intel的H.265硬编码器是世界上最好的硬编码器)

  • 6、Hisilicon

  • 7、Huawei(跟海思不是同一个部门)

  • 8、KDDI

  • 9、Broadcom(博通)

  • 10、Sharp(夏普)

  • 11、Technicolor

  • 12、DJI(大疆关心航拍方面的议题)

  • 13、Sony

  • 14、LGE

  • 15、Ericsson(爱立信)

当然,除了产业界还有一些高校与同样做出了巨大贡献。

国内参与的高校有北京大学(高文院士团队)、清华大学、上海交大、浙江大学、成都电子科技大学等。

国外的有RWTH Aachen University的大神Jens-Rainer Ohm。

而且,这个领域华人做得很出色,无论产业界还是学界都有很多都是华人作为代表来参与H.266/VVC标准制定。

对新标准的主要要求如下:

  • 在相同的体验质量下,提供比现有HEVC标准好30%至50%的压缩算法,支持无损和主观无损压缩

  • 支持4K至16K分辨率以及VR 360°视频

  • 支持具有4:4:4、4:2:2和4:2:0量化的YCbCr色彩空间

  • 每个分量的色深为8位至16位

  • BT.2100和16级以上的高动态范围(HDR)。

  • 辅助通道,如深度通道、阿尔法通道等

  • 从0到120赫兹的可变和分数帧率

  • 具有时间上(帧率变化)和空间上(分辨率变化)可扩展性的编码

  • SNR、立体/多视角编码、全景格式和静态图像编码。

与HEVC相比,预计编码复杂度将增加10倍,解码复杂度将增加2倍。

VVC压缩标准也被称为H.266、ISO/IEC 23090-3、MPEG-I part3和未来视频编码(FVC),于2020年7月6日定稿。本文讨论了已成为VVC标准一部分的最有趣的视频编码技术。

编码结构

slices、tiles、subpictures

CTU(编码树单元)的大小已经从64х64增加到128х128像素。tiles、slices和subpictures现在在比特流中被逻辑地分开。每个视频帧被分割成一个有规律的网格块。几个块可以组合成逻辑区域,定义为tiles、slices和subpictures。这些方法在早期的编解码器中已经是众所周知的,但VVC采用了一种新的方式来组合它们。这些区域的关键特征是它们在比特流中被逻辑地分开,并提供多样化的选择:

  • 编码器和解码器可以实现并发处理

  • 解码器可以选择只对它需要的视频区域进行解码(一个可能的应用是传输全景视频,用户可能只看到完整视频的一部分)

  • 比特流的编码方式可以在不重新编码的情况下即时提取视频流的一部分。

块划分

在HEVC中只有单一的树状结构,允许将每个方形块递归地分割成4个方形子块。现在,VVC在一个多树结构中提供了几种可能的分割操作。第一个分割是进入一个四叉树,就像HEVC中一样。此外,每个块还可以被水平和垂直地分割成2(BT分割)或3(TT分割)个部分。

这一步又是递归进行的,所以每个矩形块可以进一步被分成水平或垂直的2或3部分。这种方法能使编码器更好地适应输入,但也大大增加了视频编码的复杂性。 

此外,亮度编码块和色度编码块可以是不同的,形成一个双树结构。换句话说,在同一CTU内,色度样本可以有一个独立于亮度样本的编码树结构。这使得对色度样本使用比对亮度样本更大的编码块成为可能。

块预测

空域预测

对于帧内预测,现有的Planar、DC、PCM和Angular Prediction模式仍然可用。角度预测的方向数已从HEVC中的33个增加到65个。

由于VVC中的预测块可能不是方形的,一些传统的模式被广角方向(广角帧内预测 Wide Angle Intra Prediction)所适应性地取代。因此,更多的参考像素可以被用于预测。从本质上讲,这将预测方向的角度拓宽到超过一般的45°和-135°。

VVC增加了一个新的依赖位置的预测组合(Position-dependent prediction combination)模式,在这种模式下可以进行方向性插值。它将空域(帧内)预测与一些主要样本和参考样本的位置依赖性加权相结合。

此外,在许多情况下,亮度和色度分量携带非常相似的信息,因此为这些情况增加了一种新的预测模式,称为跨分量预测(Cross-component Prediction)。在这种模式下,可以从重建的亮度块中直接预测色度分量,使用重建像素的线性组合。这种模式有两个参数,系数和偏移量,其中系数是由帧内参考像素计算出来的。如果有必要,该块也会被缩放。

在VVC中,现在可以使用与当前块不直接相邻的两条线进行预测;这被称为多参考线预测(Multi Reference Line Prediction)

 

帧间预测

从一张或两张参考图片进行单向和双向运动补偿的基本概念大多没有变化。然而,有一些新的工具,没有在之前的视频编码标准中使用过

传统的运动补偿表示二维平面运动。然而,这种运动在实际视频中很少遇到,因为物体的移动更加自由并且可能同时改变形状。对于这些情况,在VVC中实现了仿射运动(Affine motion)模型,它使用两个或三个矢量来实现四或六个自由度的运动。

最大的亮度运动矢量精度从1/4增加到1/16像素,而相应的色度运动矢量精度从1/16增加到1/32像素。

现在可以使用自适应运动矢量分辨率(Adaptive motion vector resolution)进行编码。这有助于降低运动矢量中较大值的编码消耗,对高分辨率(4K及以上)来说尤其重要。

现在有了一种补偿重叠块运动的方法。这种方法被称为重叠块运动补偿(Overlapped Block Motion Compensation),对相邻块的边缘进行重叠,然后对其进行平滑处理,以避免通常在帧间预测中出现的尖锐过渡。

如果块使用双向预测,新的BDOF(双向光流 Bi-directional optical flow)方法可用于细化预测块的运动。这种算法不需要解码器信号,可以节省2%到6%的比特率。

解码器侧的运动矢量细化(Decoder side motion vector refinement)使得在解码器中细化运动矢量成为可能,而无需传输额外的运动数据。这个过程包括三个阶段:首先,进行双向预测,并将数据加权到一个初步预测块。然后,围绕原始块的位置进行固定数量的搜索。如果找到一个更好的位置,则对原始运动矢量进行相应的更新。最后,用更新后的运动矢量进行新的双向预测,得到最终的预测结果。

矩形块通常不能很好地预测真实视频。为了更有效地进行预测,VVC中加入了几何划分(Geometric Partitioning)。这个选项允许将一个块被非水平地划分成两部分,并对每一部分进行单独的运动补偿。目前的实现包括82种不同的几何划分模式。

变换和量化

在VVC中,最大的变换块大小已经增加到64×64。这些变换在涉及到高清和超清内容时特别有用。

与HEVC只有一个DCT(DCT-II)变换不同,VVC有4个可分离的变换。

  • DCT(DCT-VIII):一种VIII型离散余弦变换

  • DST-VII:一个离散正弦变换。

编码器可以根据预测模式选择不同的变换。

VVC标准中的自适应环路滤波有以下特点:

  • 7x7的菱形滤波器(13个不同的系数)用于亮度分量,5х5的菱形滤波器(7个不同的系数)用于色度分量。

  • 每个4х4的亮度块使用一个垂直、一个水平和两个对角线梯度被分到到25个不同的类别中。

  • 根据计算出的梯度,滤波器系数在应用前可以进行这三种变换之一:

    对角线反射、垂直反射或旋转。

HEVC VS VVC

下图展示了使用HEVC HM 16.15和VVC VTM-12.0参考编码器编码两个测试序列的结果。在这两种情况下,都是使用标准配置文件(randomaccess.cfg)和同样优化的编码器进行编码。

从图中可以看出,VVC的编码效率在所有比特率下都超过了以前的标准。考虑BQMall序列和其中间部分达到的码率,HEVC的比特率为1002 kbps,APSNR为38.58 dB。使用VVC编码达到类似的质量只需要696 kbps的比特率(APSNR为38.50 dB),获得了30%的比特率节省。HEVC的编码时间约为17分钟,而VVC的编码时间为2.5小时,是其9.3倍。

 图1 BQMall序列

 图2 Basketball Drill序列

有关H.266视频编解码标准的更多相关文章

  1. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  2. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  3. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  4. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  7. ruby-on-rails - 使用 Ruby 标准 Logger 每天只创建一个日志 - 2

    我正在使用ruby​​标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log

  8. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  9. 用于从 Open3.popen3 标准输出中提取值的正则表达式 - 2

    如何获取外部命令的输出并从中提取值?我有这样的东西:stdin,stdout,stderr,wait_thr=Open3.popen3("#{path}/foobar",configfile)if/exit0/=~wait_thr.value.to_srunlog.puts("Foobarexitednormally.\n")puts"Testcompleted."someoutputvalue=stdout.read("TX.*\s+(\d+)\s+")puts"Outputvalue:"+someoutputvalueend我没有在标准输出上使用正确的方法,因为Ruby告诉我它不能

  10. ruby - 强制 Ruby 不以标准形式/科学记数法/指数记数法输出 float - 2

    我遇到了同样的问题here对于python,但对于ruby​​。我需要输出这样一个小数字:0.00001,而不是1e-5。有关我的特定问题的更多信息,我正在使用f.write("Mynumber:"+small_number.to_s+"\n")输出到一个文件对于我的问题,准确性不是什么大问题,所以只做一个if语句来检查是否small_number那么更通用的方法是什么? 最佳答案 f.printf"Mynumber:%.5f\n",small_number您可以将.5(小数点右侧5位数字)替换为您喜欢的任何特定格式大小,例如,%8

随机推荐