ffmpeg:明确标记h.264为bt.601,而不是未指定?


12

我想将视频明确标记为bt.601,而不是“未指定”。我知道播放器通常选择bt.601作为宽度小于1280像素的视频的默认设置,但我想明确指出bt.601是视频的正确颜色矩阵。

症结在于,bt601ffmpeg或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的别名还是具有数值等效的颜色矩阵?


我有完全一样的问题。您是否确定了用于获取用BT.601标记的h264高清素材的命令行?
卡斯珀

@Casper:是的,我接受了Mulvya的回答,因为查找正确选项的信息很多。我进行了编辑,以明确包括正确的选项(例如NTSC是-color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m)。
彼得·科德斯

Answers:


12

PAL和NTSC具有不同的原色,所以

NTSC = SMPTE 170M = BT 601525

PAL = BT 470 BG = BT 601625

请参阅活动H.264 标准的第387页的表中有关值5和6的行。


因此,ffmpeg的正确参数为:

NTSC:

# NTSC
ffmpeg -i input  \
 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m

mediainfo:
Color primaries                          : BT.601 NTSC
Transfer characteristics                 : BT.601
Matrix coefficients                      : BT.601

朋友:

-color_trc不接受bt470bg,但ffmpeg -h full表示gamma28该选项的意思是“ BT.470 BG”。

# PAL
ffmpeg -i input  \
 -colorspace bt470bg -color_primaries bt470bg -color_trc gamma28

mediainfo:
Color primaries                          : BT.601 PAL
Transfer characteristics                 : BT.470 System B, BT.470 System G
Matrix coefficients                      : BT.601

-colorspace是最重要的选择;其他对于mpvLinux上的软件播放器没有明显的影响。


嗯当然了 我什至在看bt601维基百科页面,都没有从有两行的表中得到线索。德普
彼得·科德斯

对于那些希望使用HandBrake进行相同设置的用户,请在“视频”选项卡下的“附加选项”编辑框中,输入以下字符串:“ colorprim = smpte170m:transfer = smpte170m:colormatrix = smpte170m”
pcunite
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.