本文由 简悦SimpRead 转码,原文地址 codecalamity.com
tl;dr: 如果你不想在命令行上手工操作,请使用FastFlix。如果你有任何is......
tl;dr: 如果你不想在命令行上用手做工作,请使用FastFlix。如果你有任何问题,请在discord上联系,或者开一个github issue。
我之前在handbrake的编码设置的帖子中谈到了这个问题,但是有一个根本性的缺陷,使用Handbrake的HDR 10位视频....它只有一个8位内部管道! 它和其他大多数GUI还不支持动态元数据,如HDR10+或杜比视界。
2021-02更新:Handbrake的最新代码有HDR10静态元数据支持。
值得庆幸的是,你可以避免一些麻烦,通过使用FastFlix代替保存HDR10或HDR10+,或者直接使用FFmpeg。(要了解用HDR10+提取和转换或通过重配保存Dolby Vision,请往前跳。) 如果你想自己做这些工作,这里有两个最基本的命令,你需要保存你多汁的HDR10数据。这将使用Dolby Vision(配置文件8.1)Glass Blowing demo。
提取母带显示元数据
首先,我们需要使用FFprobe来提取Mastering Display和Content Light Level元数据。我们要告诉它只读取第一帧的元数据-read_intervals "%+#1",文件为GlassBlowingUHD.mp4。
ffprobe -hide_banner -loglevel warning -select_streams v -print_format json -show_frames -read_intervals "%+#1" -show_entries "frame=color_space,color_primaries,color_transfer,side_data_list,pix_fmt" -i GlassBlowingUHD.mp4
我们要发送ffprobe的内容的快速分解。
-hide_banner -loglevel warning不要显示我们不需要的东西-select_streams v我们只想要视频(v)流的细节-print_format json让它更容易解析-read_intervals "%+#1"只抓第一帧的数据-show_entries ...只挑选我们想要的相关数据-i GlassBlowingUHD.mp4输入(-i)是我们的Dobly Vision演示文件
这将输出类似这样的内容。
{
"frames": [
{
"pix_fmt": "yuv420p10le",
"color_space": "bt2020nc",
"color_primaries": "bt2020",
"color_transfer": "smpte2084",
"side_data_list": [
{
"side_data_type": "Mastering display metadata",
"red_x": "35400/50000",
"red_y": "14600/50000",
"green_x": "8500/50000",
"green_y": "39850/50000",
"blue_x": "6550/50000",
"blue_y": "2300/50000",
"white_point_x": "15635/50000",
"white_point_y": "16450/50000",
"min_luminance": "50/10000",
"max_luminance": "40000000/10000"
},
{
"side_data_type": "Content light level metadata",
"max_content": 0,
"max_average": 0
}
]
}
]
}
我选择通过-print_format json选项用json输出,以使它更容易被机器理解,但如果你只想得到文本,你可以省略它。
我们现在要把所有的数据,分解成<颜色缩写>(<x>, <y>)的组,同时在大多数情况下,把右边的/50000去掉,所以例如我们把red_x``"35400/50000"和red_y``"14600/50000"合并成R(35400,14600)。
G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(40000000, 50)
如果你的颜色数据没有被"/50000 "除以,或者发光没有被 "10000 "除以,并且被简化了,你将不得不把它扩展到完整的比例。例如,如果你列出了"'red_x': '17/25', 'red_y': 8/25",你必须用 "50000 "除以目前的分母("25"),得到比率("2000"),然后乘以分子"(17 "和 "8"),得到适当的 "R(34000,16000)"。
这个数据,以及0,0的内容光照度<max_content>,<max_average>将被送入编码器命令选项。
转换视频
这个命令只转换视频,保持HDR10的完整。我们将不得不把这些参数不是传给ffmpeg,而是通过-x265-params选项直接传给x265编码器。(如果你对FFmpeg不熟悉,不要担心。FastFlix,我在后面会讲到,它将为你做这些工作!)
ffmpeg -i GlassBlowingUHD. mp4 -map 0 -c:v libx265 -x265-params hdr-opt=1:repeat-headers=1:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc: master-display=G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(40000000,50):max-ll=0,0 -crf 20 -preset veryfast -pix_fmt yuv420p10le GlassBlowingConverted. mkv
让我们来分析一下我们在 "x265-params "中的内容。
hdr-opt=1我们告诉它是的,我们将使用HDR。repeat-headers=1我们希望在每一帧上都有这些标题。colorprim,transfer和colormatrix与ffprobe所列相同。master-display这是我们添加上面的颜色字符串的地方。max-ll内容光照度数据,在我们的例子中是0,0。
在这样的转换过程中,当Dolby Vision层存在时,你会看到很多信息,如[hevc @ 000001f93ece2e00] Skipping NAL unit 62,因为有一整个层ffmpeg还不知道如何解码。
对于转换的质量,我是把它设置为-crf 20,用-preset veryfast来快速转换而不损失很多质量。下面我将深入探讨FFmpeg如何处理crf与preset的质量问题。
由于 "map 0 "选项,所有的声音和数据都会被复制过来,这是一个 "从第一个(0起始索引)输入流复制所有东西 "的总声明。
这就是你需要知道的关于如何对视频进行编码和保存HDR10数据的所有基本知识
FFmpeg转换设置
我在另一篇文章中谈到了这一点,但我想通过完整的 "preset"和 "crf",你可能会觉得倾向于使用。我使用VMAF和SSIM计算,在11秒的片段中比较了每个编码和原始编码。然后,我为这个单一的图表创建了超过100个转换,所以它有点拥挤。
第一个收获是,"超慢 "和 "较慢 "之间没有真正的区别,"极快 "和 "较快 "之间也没有区别,因为它们的线是画在彼此的上面。对于 "VMAF "和 "SSIM "的分数也是如此。
第二,正常人都不会通过使用超快来保存录像。那纯粹是为了实时流媒体使用。
现在,对于VMAF分数,在观看时,离源头5~6点是可以视觉上区分的。换句话说,它将有非常明显的伪影。就我个人而言,我可以在我的屏幕上分辨出只有一位数的差异,有些人甚至更敏感,所以这绝不是一个精确的判断。至少,让我们放大一点,摆脱任何会产生非常明显的伪影的视频。
(SSIM图表)
从这些图表中可以看出,显然没有任何理由使用 "慢 "以外的东西。我个人对任何正在编码的东西都是这样做的。然而,"slow "并没有辜负它的名字。
编码速度和比特率
我不得不从主图表中删去veryslow和slower,以便能够看到其余部分,而且slow仍然比medium慢三倍。所有的图表都包含相同的数据,只是从每个图表中删除了一些运行时间较长的预设,以便更好地看到较快预设的细节。
请注意,前三个 "crf "数据点有点脏,因为系统在前三次测试中都在使用。然而,有足够的干净数据,可以看到下一步的比较情况。
为了更清楚地看到每个预设的时间,我将排除前三次,并对剩余的数据进行平均。然后将这些数据与目前的 "中"(默认)和11秒的原始剪辑长度进行比较。
| Preset | Time | vs “medium” | vs clip length (11s) |
|---|---|---|---|
| ultrafast | 11.204 | 3.370x | 0.982x |
| superfast | 12.175 | 3.101x | 0.903x |
| veryfast | 19.139 | 1.973x | 0.575x |
| faster | 19.169 | 1.970x | 0.574x |
| fast | 22.792 | 1.657x | 0.482x |
| medium | 37.764 | 1.000x | 0.291x |
| slow | 97.755 | 0.386x | 0.112x |
| slower | 315.900 | 0.120x | 0.035x |
| veryslow | 574.580 | 0.066x | 0.019x |
这里有点可怕的是,即使使用 "超快 "预设,我们也无法获得实时转换,而这些测试是在一个相当高功率的系统上运行的,挥舞着i9-9900k! 虽然从 "crf "图中可以看出 "slow "是明显的赢家,除非你有一个强大的电脑,否则它可能是一个非选择。
使用你有耐心的最慢的预设。
FFmpeg编码指南
也不像 "VBR "编码,使用 "crf "的平均比特率和文件大小将巨大的差异,基于不同的源材料。接下来的图表只是展示了你将看到的基本的曲线效果,但是它不能与你期望看到的文件进行比较。
两个大的跳跃是在慢速和中速以及非常快和超快之间。这很有趣,因为在VMAF的比较中,慢速和中速相差甚远,而 "非常快 "和 "超快 "则不然。我以为从 "超快 "到 "超快 "的下降幅度会更大,但我错了。
FastFlix, 为你做繁重的工作
我写了一个GUI程序,FastFlix,围绕FFmpeg和其他工具,将视频轻松转换为HEVC、AV1和其他格式。虽然我不保证它能提供你想要的一切,但它能为你提取视频的HDR10细节,并将它们传入FFmpeg命令。FastFlix甚至可以处理HDR10+元数据 它还有一个面板,可以准确地显示它要运行的命令,所以你可以复制它,并根据你的需要进行修改。
如果你对它有任何问题,请通过提出问题提供帮助!
用HDR10+元数据进行提取和编码
首先,这不适合胆小的人。 幸好最新的FFmpeg builds的Windows版本现在默认支持HDR10+元数据文件,所以这个过程变得简单多了。这里有一个快速的概述如何做,同时也要感谢下面评论中的 "Frank "给我提供了这个工具
你必须从quietviod's repo.下载一个hdr10plus_parser的副本。
检查以确保你的视频有HDR10+信息,它可以读取。
ffmpeg -loglevel panic -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc -| hdr10plus_parser --verify -
它应该产生一个漂亮的信息,说明有HDR10+元数据。
正在解析HEVC文件的动态元数据...
检测到动态HDR10+元数据。
Parsing HEVC file for dynamic metadata...
Dynamic HDR10+ metadata detected.
一旦你确认它的存在,将它提取到一个json文件中
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_parser -o metadata.json -
选项1:使用最新的FFmpeg
你只需要通过x265-params中的dhdr10-info选项传递元数据文件。不要忘记添加你的音频和字幕设置
ffmpeg.exe -i input. mkv -c:v libx265 -pix_fmt yuv420p10le -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=1016,115:hdr10=1:dhdr10-info=metadata. json" -crf 20 -preset medium "output.mkv"
选项2:(原文)使用自定义编译的x265
现在,痛苦的部分你要自己努力一下了。为了使用元数据文件,你需要用cmake选项 "HDR10_PLUS "自定义编译x265 。否则当你试图用它进行转换时,你会看到类似 "x265 [警告]: -dhdr10-info禁用。在cmake中启用HDR10_PLUS。"在输出中,但它仍然会编码,只是没有HDR10+支持。
一旦编译完成,你将不得不使用x265作为你转换管道的一部分。使用x265将你的视频与HDR10+元数据和其他你之前发现的细节进行转换。
ffmpeg -loglevel panic -y -i input.mkv -to 30. 0 -f yuv4mpegpipe -strict -1 - | x265 --y4m --crf=20 --repeat-headers --hdr10 --colorprim=bt2020 --transfer=smpte2084 --colormatrix=bt2020nc --master-display="G(13250, 34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000,1)" --max-cll="1016,115" -D 10 --dhdr10-info=metadata. json output.hevc
然后你将不得不用ffmpeg使用该output.hevc文件,将其与你的音频转换和字幕等结合起来,重新包装它。
保存Dolby Vision
感谢评论中的Jesse Robinson,现在似乎可以在没有原始RPU文件的情况下提取和转换带有Dolby Vision的视频。像原来的HDR10+部分一样,你需要直接使用x265的可执行文件,因为它根本不支持通过FFmpeg的选项。
注意我说的是 "保存 "而不是 "转换",因为除非你有DV的原始RPU文件来传递给x265,否则到现在为止你已经不走运了,不能转换视频。x265编码器能够接受RPU文件并创建一个准备好的杜比视界电影。这确实需要你有视频的RPU文件。
2022年更新:NVEncC也接受RPU文件,如果你有一个Nvidia显卡,则更容易操作。
用x265转换Dolby Vision文件时,有一些额外的注意事项。首先,你需要使用适当的10或12位版本。其次,根据需要改变pix_fmt、input-depth和output-depth。最后,你必须提供一个dobly-vision-profile级别,以便读取RPU,并通过提供vbv-bufsize和vbv-maxrate启用VBV(阅读x265命令行选项,看看哪些设置最适合你。)
ffmpeg -i GlassBlowing.mp4 -f yuv4mpegpipe -strict -1 -pix_fmt yuv420p10le - | x265-10b --input-depth 10 --output-depth 10 --y4m --preset veryfast --crf 22 --master-display "G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(40000000,50)" --max-ll "0,0" --olormatrix bt2020nc --colorprim bt2020 --transfer smpte2084 --dolby-vision-rpu glass.rpu --dolby-vision-profile 8.1 --vbv-bufsize 20000 --vbv-maxrate 20000 glass_dv.hevc
一旦glass_dv.hevc文件被创建,你将需要使用tsMuxerR(此版本被一些人推荐,最新的夜间版链接在下面)把它放回容器中,并把音频加回去。
目前,试图用FFmpeg或MP4Box将 FFmpeg 5.0+支持Dolby Vision的重合。你可以用FastFlix的 "复制 "功能,或在命令行上用ffmpeg和glass_dv.hevc添加到一个容器中会破坏杜比视界。因此,需要特殊的Muxer。-c:v copy来做视频轨道。请确保你至少使用5.0版本,否则将无法工作。这将导致视频具有BL+RPU Dolby Vision。
也可以只转换音频,并通过再转换器来改变流。例如tsMuxeR (nightly build, not default download)是很流行的,它可以把大多数电视不能识别HDR的mkv文件,重新转换成ts文件,这样它们就能识别了。如果你还有TrueHD音轨,你可能需要先用eac3to把它分成TrueHD和AC3 Core音轨,然后再进行混频。
轻松查看HDR/视频信息
另一个快速查看视频的HDR类型的有用程序是MediaInfo。例如,这里是原始的杜比视界玻璃吹制视频信息(一些修剪)。
Video
ID : 1
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main 10@L5.1@Main
HDR format : Dolby Vision, Version 1.0, dvhe.08.09, BL+RPU, HDR10 compatible / SMPTE ST 2086, HDR10 compatible
Codec ID : hev1
Color space : YUV
Chroma subsampling : 4:2:0 (Type 2)
Bit depth : 10 bits
Color range : Limited
Color primaries : BT.2020
Transfer characteristics : PQ
Matrix coefficients : BT.2020 non-constant
Mastering display color primaries : BT.2020
Mastering display luminance : min: 0.0050 cd/m2, max: 4000 cd/m2
Codec configuration box : hvcC+dvvC
而这里是转换后的情况。
Video
ID : 1
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main 10@L5.1@Main
HDR format : SMPTE ST 2086, HDR10 compatible
Codec ID : V_MPEGH/ISO/HEVC
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 10 bits
Color range : Limited
Color primaries : BT.2020
Transfer characteristics : PQ
Matrix coefficients : BT.2020 non-constant
Mastering display color primaries : BT.2020
Mastering display luminance : min: 0.0050 cd/m2, max: 4000 cd/m2
注意,我们已经失去了Dolby Vision, BL+RPU的信息,但至少我们保留了HDR10的数据,这是Handbrake做不到的!
这是一个包装!
希望你觉得这些信息有用,请随时留言反馈,提出建议或问题!
直到下一次,保持安全和相互关爱!