ffmpeg 应用了不正确的 SMPTE170M 传输函数?

ffmpeg 应用了不正确的 SMPTE170M 传输函数?

我想使用 ffmpeg 将 SMPTE170M OETF 应用于示例输入。我尝试过:

# 1
ffmpeg -y -framerate 25 -i linear.png -sws_flags accurate_rnd+full_chroma_int \
  -vf "zscale=min=gbr:tin=linear:m=gbr:t=smpte170m" out1.png

#2
ffmpeg -y -framerate 25 -i linear.png -sws_flags accurate_rnd+full_chroma_int \
  -vf "colorspace=iall=bt709:itrc=linear:all=bt709" out2.png

对于 #1,与手动计算相比,转换后的值都太高了。例如,对于通道值 200,规范规定:

V=200/255
1.099*V^.45 - 0.099 = 0.886185722 (aka 226)

但 ffmpeg 将产生 231。无论通道如何,只要输入相同,它就会产生该值。

使用 #2,产生的值会根据通道而变化。我知道在过滤器周围添加了 RGB->YUV->RGB 转换,colorspace但我不确定为什么这会导致如此明显的差异。例如,对于每个通道的输入值为 200/255,我得到:

0,0: (237,62,0)  #ED3E00  srgb(237,62,0)
0,0: (0,208,0)  #00D000  srgb(0,208,0)
0,0: (0,46,232)  #002EE8  srgb(0,46,232)
0,0: (226,226,226)  #E2E2E2  srgb(226,226,226)

请注意,灰度值实际上是我期望的正确值。

我如何修复一个/两个咒语以产生预期的结果?

相关内容