ffmpeg: явно помечать h.264 как bt.601, а не оставлять неуказанным?

12

Я хочу отметить видео как явно bt.601, а не "не указано". Я знаю, что игроки обычно выбирают bt.601 по умолчанию для видео с шириной менее 1280 пикселей, но я хочу прямо указать, что bt.601 - это правильная цветовая матрица для видео.

bt601Камнем преткновения является то, что для ffmpeg или libx264 нет опции, только bt709 и некоторые другие.

У меня есть несколько видео, которые были уменьшены с HD, и все еще находятся в бт.709, но не помечены должным образом. Поэтому, когда я смотрю видео, мне иногда приходится вручную переключать плеер на bt.709 . Явная пометка как bt.601 сообщит будущим зрителям (например, мне), что это определенно bt 601, а не ошибочно помеченное видео bt.709, когда я смотрю на него mediainfo.

Другим вариантом использования для этого может быть увеличение масштаба видео с bt 601 до 1280 или выше без преобразования (с использованием -vf colormatrix) цветовой матрицы, игроки неверно примут bt 709, если вы не указали информацию о цвете.

colormatrixВидеофильтр FFMpeg поддерживает bt601цветовую матрицу ввода или вывода, но также не устанавливает теги. (Поскольку у него нет побочного эффекта при настройке параметров цвета в ffmpeg, он отказывается даже работать с src и dest так же, как -vf colormatrix=bt601:bt601.)


ffmpg in  -color_primaries bt709 -color_trc bt709 -colorspace bt709  out

пометит выходное видео как использование bt.709 для yuv <-> rgb. Теги оказываются внутри самого потока битов видео, а не только в контейнере (поскольку это, по-видимому, относится к конкретным кодекам, а не к контейнерам, по крайней мере для контейнеров 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 показывает тот же набор параметров для своих параметров цвета, который -c:v libx264видеокодек ffmpeg передает x264. Является ли какой-либо из них псевдонимом для bt.601 или имеет численно эквивалентную цветовую матрицу?

Питер Кордес
источник
У меня точно такая же проблема. Вы выяснили командную строку, чтобы использовать метки h264 HD, помеченные BT.601?
Каспер
@Casper: да, я принял ответ Mulvya, потому что было достаточно информации, чтобы найти правильные варианты. Я сделал правку, чтобы явно включить правильные параметры (например, NTSC -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Питер Кордес

Ответы:

12

PAL и NTSC имеют разные цветовые праймериз, поэтому

NTSC = SMPTE 170M = BT 601 525

PAL = BT 470 BG = BT 601 625

См. Строки для значений 5 и 6 в таблице на странице 387 активного стандарта H.264 .


Итак, правильные аргументы для 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

PAL:

-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это самый важный вариант; другие не делают видимой разницы для программных плееров, как mpvна Linux.

Gyan
источник
Ну конечно. Я даже просматривал страницу википедии bt601 и не мог понять, что в таблице два ряда. Derp.
Питер Кордес
Для тех, кто хочет сделать то же самое с HandBrake, на вкладке «Видео» в поле редактирования «Дополнительные параметры» введите следующую строку: «colorprim = smpte170m: перевод = smpte170m: colormatrix = smpte170m»
pcunite,