HDR视频的编码参数

对于hdr视频的一个ffmpeg编解码命令或者参数在该篇中进行过记录,这里来详细解释一下其中参数的意义。另外这篇帖子对HDR的四个标准以及相关概念解释感觉不错。

首先两个制定标准的协会和部分简称:

SMPTE:电影电视工程师协会(Society of Motion Picture and Television Engineers)

ITU-R:国际电信联盟无线电通信部门(ITU Radiocommunication Sector)

解码

      因为以mp4等封装格式的视频里面已经包含了相关编解码信息,所以不需要什么复杂参数即可解码成yuv格式的视频。

ffmpeg -i input.mp4 -y output.yuv

解码后变成了yuv这种纯数据格式,如果涉及到hdr视频的话,相应的元数据metadata(用于彩色体积变换)会丢失掉。

编码

将hdr的yuv视频格式转换成mp4(即编码,这里只是探讨添加metadata力的参数与),首先给出两个转换命令来对比生成的mp4视频里面的信息有什么不同。

ffmpeg -s 1920X1080 -r 60 -pix_fmt yuv420p10le -i Morocco_HDR_1920X1080_10bit.yuv -r 60 -crf 1 -c:v libx265 -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=""G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)"":max-cll=""1000,400"":min-luma=0.001:max-luma=4000" -y Morocco_HDR.mp4

生成的MP4视频使用mediaInfo查看,可以看到底部的一些信息为:

Color range                              : Limited
Color primaries                          : BT.2020
Transfer characteristics                 : PQ
Matrix coefficients                      : BT.2020 non-constant
Mastering display color primaries        : Display P3
Mastering display luminance              : min: 0.0001 cd/m2, max: 1000 cd/m2
Maximum Content Light Level              : 1000 cd/m2
Maximum Frame-Average Light Level        : 400 cd/m2

使用:

ffmpeg -s 1920X1080 -r 60 -pix_fmt yuv420p10le -i Morocco_HDR_1920X1080_10bit.yuv -r 60 -crf 1 -c:v libx265 -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=""G(12250,35150)B(6899,2600)R(33899,16099)WP(15634,16449)L(10000000,0)"":max-cll=""1100,180"":min-luma=0.0000:max-luma=1000" -y Morocco_HDR.mp4

其信息变为:

Color range                              : Limited
Color primaries                          : BT.2020
Transfer characteristics                 : PQ
Matrix coefficients                      : BT.2020 non-constant
Mastering display color primaries        : R: x=0.677980 y=0.321980, G: x=0.245000 y=0.703000, B: x=0.137980 y=0.052000, White point: x=0.312680 y=0.328980
Mastering display luminance              : min: 0.0000 cd/m2, max: 1000 cd/m2
Maximum Content Light Level              : 1100 cd/m2
Maximum Frame-Average Light Level        : 180 cd/m2

通过以上参数对比,最大的差别在于master-display这里,其他的参数应该都能对应的上,比如说max-cll分别控制着Maximum Content Light Level,Maximum Frame-Average Light Level 。

通过x265的官方参数中的VUI (Video Usability Information) options模块说明,可以找到这些参数的意义所在:

       colorprim:Specify color primaries to use when converting to RGB,一般可理解为色域,常见的有Rec.709(全高清广播标准)、Rec.2020(4K/8K广播标准BT.2020)、Adobe RGB、P3等。

  1. bt709
  2. unknown
  3. reserved
  4. bt470m
  5. bt470bg
  6. smpte170m
  7. smpte240m
  8. film
  9. bt2020
  10. smpte428
  11. smpte431
  12. smpte432

常用的大概就是bt709和bt2020.

色域指可以显示的所有颜色的范围。上图表显示了人眼能够感知的所有RGB值的范围。三角形表示色域:三角形越大,可以显示的颜色越多。  附一张色域标准更多的图:

    一般的,电影视频在采集及后期制作的时候是根据DCI-P3色彩空间。但在普通SDR显示器上需要统一转换为Rec.709色彩空间,它大概能占到P3色域的百分之九十。   

transfer:Specify transfer characteristics,可以理解为转换曲线。(常见的hdr转换曲线为HLG和PQ)

  1. bt709
  2. unknown
  3. reserved
  4. bt470m
  5. bt470bg
  6. smpte170m
  7. smpte240m
  8. linear
  9. log100
  10. log316
  11. iec61966-2-4
  12. bt1361e
  13. iec61966-2-1
  14. bt2020-10
  15. bt2020-12
  16. smpte2084
  17. smpte428
  18. arib-std-b67

其中,smpte2084为PQ曲线(感知量化),arib-std-b67为HLG曲线(混合对数伽玛)。这两种常用的HDR电光转换曲线(显示器的动态范围电光传递函数)都已经标准化为:

PQ=SMPTE ST 2084

HLG=ARIB STD-B67 

以后提到SMPTE ST 2084,其实就是值的PQ曲线。详细了解了这种转换曲线后,可能会有一种疑问,为什么会有这种光电和电光转换曲线,而且还是非线性的。归根结底还是为了节省存储。由于人眼对于光强度的敏感度是非线性的。所以在光强度变化明显的范围我们分配的用于记录其信息的数据多一点,同样,在不敏感区域就分配数据少一点。

    colormatrix:颜色空间

0.GBR
1.bt709
2.undef
3.reserved
4.fcc
5.bt470bg
6.smpte170m
7.smpte240m
8.YCgCo
9.bt2020nc
10.bt2020c
11.smpte2085
12.chroma-derived-nc
13.chroma-derived-c
14.ictcp

颜色空间由颜色模型和色域共同定义。例如Adobe RGB和sRGB都基于RGB颜色模型,但它们是两个不同的颜色空间;色域的概念前面已经提到,颜色模型的概念为:一种抽象数学模型,通过一组数字来描述颜色(例如RGB使用三元组、CMYK使用四元组)

    master-display:SMPTE ST 2086 mastering display color volume SEI info,看到SMPTE ST 2086,如果知道他的含义就很明确了,他就是前面提到的元数据。使用PQ曲线的HDR10是采用静态元数据的,但是杜比公司提出来的杜比视界和三星的HDR10+,尽管使用了PQ曲线,但是他们使用的是动态元数据,HLG没有元数据。其中

DolbyVision 等价于SMPTE ST 2094-10

HDR10+ 等价于 SMPTE ST 2094-40

那么根据推测 SMPTE ST 2094-20肯定是飞利浦出品的了。

这张图可以表示元数据和电光转换曲线的联系。

继续看元数据的一些参数:

在设置的时候,有G(X,Y),B(X,Y),  R(X,Y),WP(X,Y)和L(max,min)。通过设置的数值和MP4显示的信息可知,他们的对应关系G、B

R(display primaries for RGB channels)和WP(white point)是0.00002的关系。L(最大,最小亮度)是0.0001的关系。比如,对于P3D65 1000-nits显示器,他的参数为:G(x=0.265, y=0.690), B(x=0.150, y=0.060), R(x=0.680, y=0.320),下图黑色三角形的三个顶点, WP(x=0.3127, y=0.3290)三角形中心白点位置,L(max=1000, min=0.0001),对应的设置为:G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)。不过这些设置是根据原母带信息来进行设置的,即在制作这个视频的时候,是以该设备(HDR电视,某种标准显示器)的设置信息进行调试的.即使这里做了一些改动,貌似不影响重新制作的显示效果.

这应该是一个对比标准的显示器,因为在设置这些数据的时候,我们使用mediaInfo看到的Mastering display color primaries这行显示的是P3,而这是其他的数字,则显示了正确的对应关系。还是引用一张色域图,这次附上R、G、B和WP的位置,进而表示在色域图上表示红绿蓝的位置

上图的四个圈标记的RGB以及WP的位置,DCI-P3色域。

max-cll:Maximum content light level (MaxCLL) and maximum frame average light level (MaxFALL

单个像素点最亮值(maxcll)和整个视频所有帧均值亮度最大的值(Maxfall)。例如,MaxCLL=1000 ,MaxFALL=400;则可以设置为:max-cll “1000,400” ;它们旨在成为HDR母带元数据的一部分,观看显示将从该参数计算如何显示图像并限制潜在的高功率需求(亮度越高,功率越大)。该组数据应当在进入编码器前进行计算得到的(github中有计算该参数的工程),目的就是告诉该视频的亮度特征. 显然,如果亮度过高或者功率需求过高,将会影响显示效果, 这导致在不同的显示器上观看相同的图像,亮度是有所不同的。准确的显示校准和图像播放也是一个严峻的问题。既然只是为了告诉视频使用者该视频亮度信息,不影响解码器或者显示器具体工作方式,因此,就跟这位大神说的一样:set it and forget it workflow.

min-luma:,max-luma:这个是在进行编码的时候,对输入图像的极大极小值进行限制的。上面命令行中,如果将max-luma=500,那么编出来MP4格式的视频再次转换成yuv格式后,y的数值在五百以上的就会被削峰为500.

为什么需要设置元数据

    由于符合PQ转化曲线是在Rec2020色域作为目标色彩空间的,最大支持的亮度为10000nit。但是能够只是并显示10000nit的显示器实在是太少了。市面上所谓的支持hdr图像的电视一般是1000nit。这意味着不同的UHDTV显示器将不得不基于显示器的实际色域能力“调整”显示图像色域。这是通过在定义源图像色域的UHDTV信号(与上述HDR元数据相关联的)内使用嵌入式元数据来提供的,旨在允许显示器“智能地”重新映射到可用色域上。问题是,和HDR元数据和峰值亮度限幅一样,没有提出设置的色域重映射技术。结果是,不同的显示器将以不同的方式管理所需的色域重新映射,最终产生不同的图像结果。总之其原因为:当HDR被引入时,没有电视可以匹配主控/分级显示器的峰值亮度和色域覆盖率,特别是峰值亮度。由于基于PQ的HDR的“绝对性”与母带显示无关,所以它们的峰值亮度不一样。为了试图克服这个问题,便引入了元数据以允许HDR电视重新映射图像内容。这种绝对性直接的表现可以通过上图看出。在上图通过像素点来观看当前点Y值,他是在P3色域上制作的视频(母带信息),该点图像为太阳,应当表示的非常亮才对,但也仅仅为七百多,通过下图可以看到其对应的亮度也要达到1000nit了(在其对应的SDR视频,该点的位置为230多左右)。

      总之,设置元数据的目的是告诉视频使用者,该视频的特性和信息:比如说,峰值亮度是多少。因此, 如果该显示器不支持这么高的峰值亮度,我该如何做色调映射,从而使画面可以正常的显示而不至于过曝或则其他画面问题。

    两台不同的显示器显然具有不同的峰值亮度,显示图像将需要剪切到由上述PQ EOTF图定义的可用峰值点。该“峰值亮度”由信号内的元数据控制,定义用于执行分级的显示器的峰值亮度。

     从这张图上可知,在达到100nit是所占用的电平位大概占整个(1024个)的百分之五十,现在最常用的支持1000nit的显示器,或者在现在大部分HDR视频(P3色域上制作),符合1000nit亮度。所用到的Y值也仅仅为769,占用不到百分之八十。

注意:在重新编码HDR视频时,如果观看设备和源是一样的,元数据的设置一般和mediainfo读取出来的相同即可,因为视频内容和观看设备没变。但是如果是制作的新HDR视频(由sdr转换而来)或者观看设备发生变化,元数据的某些信息需要重新计算得到的,而不是读取了一个HDR视频的元数据后所有的新生成的HDR视频都用该参数。

一:most people look up the source parameters using MediaInfo and then use those values. For master-display these have to be re-calculated but most sources seem to use the very same parameters for the color coordinates anyway where MediaInfo will say "Mastering display color primaries : Display P3" and it's the exact values you find as an example in the x265 docs.

二:Master Display encodes the color volume that the display used in mastering was. The idea is that pixels with values outside of what the mastering display could be clipped because the colorist couldn't have seen those differences. Higher end consumer TVs can deliver a lot more brightness than typical grading monitors

从实际情况看,对于绝大多数情况下,max-cll和master-display参数都不起作用(改变了参数,观看画面没有发生变化),可以看成是对视频的一种信息描述。因此,对于大多数视频编解码或者后期二次处理者而言,我们不是视频制作者,建议最好不要设置这些参数。我们只需把静态元数据当成对视频的一种描述即可。 

动态元数据

目前,基于HDR10的静态元数据的视频资源和播放设备都很少,更不要提像杜比视界和三星HDR10+的动态元数据的资源和设备。目前网上可以收集的资料以及观看效果特别少,这里有人说明了如何读取杜比视界的动态元数据以及内部工作流。感觉解释的特别好,也能够理解为什么杜比视界的方案为什么很先进了。简短的一句话就是:专门定制的色调映射方案,让每一帧都能在支持杜比视界的播放设备中得到完美的画面色彩。

PQ与HLG

这里提供一下PQ和HLG的光和Y值对应的信息,以及gamma等于2.4的曲线对比:

PQ曲线

HLG曲线

以往的视频不管分辨率如何变化,黑的定义是0.01nit,白的定义好像是100nit(120nit白峰值-数值255),这之间的变化曲线称为伽马,常见的是伽马2.2或2.4(上图实线),而HDR10、HDR10+和杜比视界(Dolby Vison)的曲线(EOTF函数)是Perceptual Quantization (PQ)-感知量化曲线(上图虚线),组织上定义为ST2084,黑的定义最低是0.001nit,白的定义最高到4000nit-数值920,也许940对应4600nit?10000nit白峰值-数值1023。

对于以上两张图需要注意的是,PQ曲线规定的亮度曲线是绝对的,即最高10000nit,无论显示设备的最高亮度如何,伽玛曲线始终相同,从而实现一致的图像再现。PQ曲线基于人类视觉感知的特征,并且最适合于在互联网上制作电影或串流视频的内容,其中再现准确性是关键。HLG曲线最高亮度与显示设备的最高亮度无关(这也从另一方面说明了为什么HLG曲线不用配置元数据)。换言之,因为伽玛曲线根据显示设备的最高亮度而变化,即使在现有的SDR显示器上,伽玛曲线也可允许接受观看HDR内容,并且图像劣化较小,HLG曲线旨在允许在现有的SDR电视上显示而不会看不到位置,并且最适合于广播电视和直播视频馈送。HDR在HLG中成为一种相对的概念,HDR标准可以按照与传统SDR电视完全相同的方式进行缩放。因此第二张图中HLG曲线是对应最高亮度为1000nit,并不适合所有场景

另一方面需要明白的是,PQ和HLG都是系统级别的区别,并不是简单的曲线转换。因为从制作到播放,他们之间不能混用。传送门一传送门二传送门三

举例

以从YouTube上下载的HDR视频为例,webm格式,  我们先转成yuv,然后在转成X265封装的mp4.

首先可以通过:

ffprobe Morocco_HDR.webm

可以看到其元数据信息打印如下:

Metadata:
    ENCODER         : Lavf58.20.100
  Duration: 00:00:20.44, start: 0.000000, bitrate: 6941 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 2), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 1920x1080, SAR 1:1 DAR 16:9, 59.94 fps, 59.94 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 00:00:20.436000000
    Side data:
      Content Light Level Metadata, MaxCLL=1100, MaxFALL=180
      Mastering Display Metadata, has_primaries:1 has_luminance:1 r(0.6780,0.3220) g(0.2450,0.7030) b(0.1380 0.0520) wp(0.3127, 0.3290) min_luminance=0.000000, max_luminance=1000.000000

    通过一下命令,将Morocco_HDR_clip.webm的10bitYUV数据转成MP4.

ffmpeg -s 1920X1080 -r 24 -pix_fmt yuv420p10le -i Morocco_HDR_1920X1080_10bit.yuv -r 24 -crf 0 -c:v libx265 -x265-params "hrd=1:aud=1:no-info=1:sar='1:1':colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=""G(12250,35150)B(6900,2600)R(33900,16100)WP(15635,16450)L(10000000,0)"":max-cll=""1100,180"":min-luma=0.0000:max-luma=1000.00" -y Morocco_HDR_clip_1920X1080_10bit_meta.mp4

生成的MP4文件,通过ffprobe可以看到如下元信息:

  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:51.04, start: 0.000000, bitrate: 2705 kb/s
    Stream #0:0(und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv420p10le(tv, bt2020nc/bt2020/smpte2084, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2703 kb/s, 24 fps, 24 tbr, 12288 tbn, 24 tbc (default)
    Metadata:
      handler_name    : VideoHandler

没有看到display metadata? 具体不太清楚为什么ffprobe打印出来的没有,但是通过mediaInfo可以看到:

Color range                              : Limited
Color primaries                          : BT.2020
Transfer characteristics                 : PQ
Matrix coefficients                      : BT.2020 non-constant
Mastering display color primaries        : R: x=0.678000 y=0.322000, G: x=0.245000 y=0.703000, B: x=0.138000 y=0.052000, White point: x=0.312700 y=0.329000
Mastering display luminance              : min: 0.0000 cd/m2, max: 1000 cd/m2
Maximum Content Light Level              : 1100 cd/m2
Maximum Frame-Average Light Level        : 180 cd/m2

另外解释一下多出现的几个参数:progressive,SAR,DAR.

progressive,其实就是扫描方式,逐行扫描.另外的一种方式就是隔行扫描:interlaced.我们平时所谓的1080p,这个p就是progressive,表示的是1080尺寸的逐行扫描视频. 
DAR - display aspect ratio就是视频播放时,我们看到的图像宽高的比例,缩放视频也要按这个比例来,否则会使图像看起来被压扁或者拉长了似的。

SAR - storage aspect ratio就是对图像采集时,横向采集与纵向采集构成的点阵,横向点数与纵向点数的比值。比如VGA图像640/480 = 4:3,D-1 PAL图像720/576 = 5:4

PAR - pixel aspect ratio大多数情况为1:1,就是一个正方形像素,否则为长方形像素这三者的关系PAR x SAR = DAR或者PAR = DAR/SAR

观看

没有正确的观看软件或者配置,再好的HDR片源也无法显示其优越.如果播放方法错误了,很有可能让你的HDR转成SDR来进行显示,这个过程会涉及tone mapping,如果色域映射的不好,显示的画面甚至不如SDR.在知乎上找到了一篇文章, 对HDR的播放模式做了全面分析.另外还有YouTube上的Jacob + Katie Schwarz上传的视频都是质量想当好的。包括HDR和SDR。看他们的博客才发现,他们对HDR具有丰富的研究经验,可以查看他们的博客来对HDR从技术方面有个全面的认识。

总之最简单的一种方法就是,在window10上配置好后,直接使用window的'电视和电影'打开.像一些其他的软件,貌似还需要进行一些配置.这个在potplayer这款软件上花费了很多时间,结果还没有正确显示,一度认为HDR的效果很一般或者片源找的不对.所以在进行播放前一定要确定好播放的设备(电视)能够支持和软件正确的配置.

苹果公司方面对于HDR的支持也是很积极,最近几年发布的设备大都支持HDR,尽管亮度方面还不太够,但是画面显示方面,HDR整体上还是比SDR要好.甚至在mac上也进行了支持.不过如果按照上面提到的命令直接转码,用默认播放器或者苹果手机相册是无法播放的,解决办法:只需要添加在ffmpeg命令中添加 -tag:v hvc1 即可:

ffmpeg -s 1920X1080 -r 24 -pix_fmt yuv420p10le -i video.yuv -r 24 -crf 15 -c:v libx265 -tag:v hvc1 -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=""G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)"":max-cll=""1000,200"":min-luma=0.005:max-luma=1000" -y video.mp4

另外,在iOS设备上还可以使用其他播放器的方式进行HDR的显示,比如说VLC,但是今天推荐的软件名字叫做Infuse.其实这两种软件差不多,但是vlc的广告实在是太多,完全影响了观看体验.并且由于iOS的封闭性,往苹果手机导入视频比较麻烦,使用Infuse可以通过局域网的形式进行同步

HDR-SDR

如果有HDR的视频源,但是没有专业的显示设备,我们可能需要将HDR转成SDR.知乎上该博主对HDR探索比较专业,我这里引用他对该部分的介绍,并且列举了一个转换命令,但是奈何我的Linux上的ffmpeg不支持:zscale这个滤镜,尝试了好多方法也没有安装正确.

ffmpeg.exe -i 4k30P_HDR.mp4 -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -pix_fmt yuv420p -color_range tv -colorspace bt709 -color_trc bt709 -color_primaries bt709 -c:v libx265 -crf 18 -preset slower output.mkv

以及使用外部工具进行HDR视频的向下转换.

中国超高清视频产业联盟标准

中国也有自己的一套HDR标准:vivid。官网上有其相关的HDR标准文档。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值