我想使用 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)
请注意,灰度值实际上是我期望的正确值。
我如何修复一个/两个咒语以产生预期的结果?