对于hdr视频的一个ffmpeg编解码命令或者参数在该篇中进行过记录,这里来详细解释一下其中参数的意义。另外这篇帖子对HDR的四个标准以及相关概念解释感觉不错。
首先两个制定标准的协会和部分简称:
SMPTE:电影电视工程师协会(Society of Motion Picture and Television Engineers)
ITU-R:国际电信联盟无线电通信部门(ITU Radiocommunication Sector)
解码
因为以mp4等封装格式的视频里面已经包含了相关编解码信息,所以不需要什么复杂参数即可解码成yuv格式的视频
#普通封装格式的转换
ffmpeg -i input_video.avi output_video.mp4
# yuv之间不同格式互转,如果出现花屏现象,注意查看尺寸是否设置正确。
ffmpeg -s 1280*720 -pix_fmt yuv444p -i input.yuv -pix_fmt yuv420p output.yuv
# MP4转换成yuv
ffmpeg -i input.MP4 -pix_fmt yuv420p output.yuv
# yuv转MP4
ffmpeg -s 1280*720 -pix_fmt yuv444p -i input.yuv output_video.mp4
解码后变成了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等。
- bt709
- unknown
- reserved
- bt470m
- bt470bg
- smpte170m
- smpte240m
- film
- bt2020
- smpte428
- smpte431
- smpte432
常用的大概就是bt709和bt2020.
色域指可以显示的所有颜色的范围。上图表显示了人眼能够感知的所有RGB值的范围。三角形表示色域:三角形越大,可以显示的颜色越多。 附一张色域标准更多的图:
一般的,电影视频在采集及后期制作的时候是根据DCI-P3色彩空间。但在普通SDR显示器上需要统一转换为Rec.709色彩空间,它大概能占到P3色域的百分之九十。
transfer:Specify transfer characteristics,可以理解为转换曲线。(常见的hdr转换曲线为HLG和PQ)
- bt709
- unknown
- reserved
- bt470m
- bt470bg
- smpte170m
- smpte240m
- linear
- log100
- log316
- iec61966-2-4
- bt1361e
- iec61966-2-1
- bt2020-10
- bt2020-12
- smpte2084
- smpte428
- 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
这张图可以表示元数据和电光转换曲线的联系。
继续看元数据的一些参数:
在设置的时候,有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的位置,进而表示在色域图上表示红绿蓝的位置
max-cll:Maximum content light level (MaxCLL) and maximum frame average light level (MaxFALL)
一帧的内容最大亮度和均值亮度。例如,MaxCLL=1000 ,MaxFALL=400;则可以设置为:max-cll “1000,400” ;它们旨在成为HDR母带元数据的一部分,观看显示将从该参数计算如何显示图像并限制潜在的高功率需求(是否可以参考视频编解码的vbv模式?)。显然,这导致在不同的显示器上观看相同的图像,亮度是有所不同的。准确的显示校准和图像播放也是一个严峻的问题。
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,占用不到百分之八十。
这里提供一下PQ和HLG的光和Y值对应的信息,以及gamma等于2.4的曲线对比:
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的播放模式做了全面分析.
总之最简单的一种方法就是,在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 -c:v libx265 -crf 18 -preset slower output.mkv
以及使用外部工具进行HDR视频的向下转换.
参考文章: