为什么 ffmpeg 的“tonemap”色调映射过滤器会根据输出格式给出不同的颜色?

为什么 ffmpeg 的“tonemap”色调映射过滤器会根据输出格式给出不同的颜色?

我有一个源视频,它是使用 HEVC 编解码器的 UHD HDR MKV 文件。具体来说,ffprobe 报告的输入视频流是:

hevc(主 10)、yuv420p10le(电视、bt2020nc/bt2020/smpte2084)、3840x2160 [SAR 1:1 DAR 16:9]、23.98 fps、23.98 tbr、1k tbn、23.98 tbc(默认)

我正在尝试拍摄快照 - 在特定时间提取单帧。我天真地从这个开始:(-ss 时间只是一个例子)

ffmpeg -ss 00:01:02 -i input.mkv -vframes 1 output.png

这“有效”,但会导致颜色褪色,因为原始是 HDR 而我的 iMac 显示器不是。

未使用色调映射提取的帧

好的,我像这样启用色调映射过滤器:

ffmpeg -ss 00:01:02 -i input.mkv -vf "zscale=transfer=linear,tonemap=hable,zscale=transfer=bt709" -vframes 1 output.png

这似乎也有效,并给出了非常准确的结果:

使用色调映射将帧提取为 PNG

但是,如果我使用 imagemagick 将图像从 PNG 转换为 JPEG,颜色完全改变

convert output.png output.jpg

色调映射图像转换为 JPEG

该图像仍然比未进行色调映射的原始图像更亮,但颜色改进已丢失。图像再次变得苍白。

为什么?

奇怪且令人沮丧的是,如果我首先使用 ffmpeg 转换为 BMP,而不是 PNG,我会得到第三种不同的结果,颜色有所改善,但不如 PNG 结果好,尽管 BMP 文件确实转换为 JPEG 而颜色没有进一步改变。

ffmpeg -ss 00:01:02 -i input.mkv -vf "zscale=transfer=linear,tonemap=hable,zscale=transfer=bt709" -vframes 1 output.bmp

使用色调映射将帧提取到 BMP

这是怎么回事?

我确实注意到 PNG 使用 16 位颜色通道,而不是 8 位:

identify output.png 

输出.png PNG 3840x2160 3840x2160+0+0 16 位 RGB 24.2MB 0.000u 0:00.000

我确实尝试将“format=rgb24”附加到过滤字符串的末尾以创建一个 8 位通道 PNG,这确实有效,但结果在视觉上与上面仍然相同。

答案1

尝试

zscale=t=linear,tonemap=hable,zscale=p=709:t=709:m=709

相关内容