我想将视频明确标记为bt.601,而不是“未指定”。我知道播放器通常选择bt.601作为宽度小于1280像素的视频的默认设置,但我想明确指出bt.601是视频的正确颜色矩阵。
症结在于,bt601
ffmpeg或libx264 没有选择,只有bt709和其他一些选择。
我有一些视频已从HD降级,但仍在bt.709中,但没有正确标记。因此,当我观看视频时,有时必须手动将播放器切换到bt.709。当我用观看时,明确标记为bt.601会与未来的观看者(例如,我自己)交流,它肯定是bt.601,而不是贴错标签的bt.709视频mediainfo
。
另一个用例是,如果您将bt.601视频放大到1280或更高而不进行-vf colormatrix
色彩矩阵转换(使用),则如果您未指定颜色信息,则播放器会错误地假设bt.709。
FFMpeg的colormatrix
视频滤镜确实支持bt601
作为输入或输出颜色矩阵,但也不设置标签。(由于设置ffmpeg的颜色选项没有副作用,因此它甚至拒绝使用src和dest进行操作-vf colormatrix=bt601:bt601
。)
ffmpg in -color_primaries bt709 -color_trc bt709 -colorspace bt709 out
会将输出视频标记为对yuv <-> rgb使用bt.709。标签最终出现在视频比特流本身内部,而不仅仅是容器内部(因为对于mp4和mkv容器来说,这似乎是特定于编解码器的东西,而不是容器的东西)。
例如mediainfo
输出:
Complete name : out.mkv
...
Writing application : Lavf57.14.100
Writing library : Lavf57.14.100
Video
ID : 1
Format : AVC
...
Writing library : x264 core 148 r2638+4 afcf21c
Encoding settings : cabac=1 / ref=8 / ...
Language : English
Default : Yes
Forced : No
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
因此bt.709很容易标记。问题是,我在任何地方都看不到bt.601。是其他名称的别名,还是真的没有办法明确指定它?
x264 --fullhelp output:
--colorprim <string> Specify color primaries ["undef"]
- undef, bt709, bt470m, bt470bg, smpte170m,
smpte240m, film, bt2020
--transfer <string> Specify transfer characteristics ["undef"]
- undef, bt709, bt470m, bt470bg, smpte170m,
smpte240m, linear, log100, log316,
iec61966-2-4, bt1361e, iec61966-2-1,
bt2020-10, bt2020-12
--colormatrix <string> Specify color matrix setting ["???"]
- undef, bt709, fcc, bt470bg, smpte170m,
smpte240m, GBR, YCgCo, bt2020nc, bt2020c
ffmpeg -h full
ffmpeg的-c:v libx264
视频编解码器将其颜色选项显示为相同的选项集,并将其传递给x264。这些中的任何一个是bt.601的别名还是具有数值等效的颜色矩阵?
-color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m
)。