ffmpeg: jawnie oznacza h.264 jako bt.601, zamiast pozostawiać nieokreślony?

12

Chcę oznaczyć wideo jako jawnie bt.601, a nie „nieokreślony”. Wiem, że gracze zazwyczaj wybierają bt.601 jako domyślny dla filmów o szerokości mniejszej niż 1280 pikseli, ale chcę wyraźnie powiedzieć, że bt.601 jest prawidłową matrycą kolorów dla wideo.

bt601Kwestią sporną jest to, że nie ma opcji dla ffmpeg lub libx264, tylko bt709 i niektórych innych.

Mam kilka filmów, które zostały zmniejszone do rozdzielczości HD i nadal są w wersji bt.709, ale nie są odpowiednio otagowane. Więc kiedy oglądam film, czasami muszę ręcznie przełączać odtwarzacz na bt.709 . Bezpośrednie oznaczenie jako bt.601 poinformuje przyszłych widzów (np. Mnie), że to zdecydowanie bt.601, a nie źle oznakowane wideo bt.709, kiedy na niego spojrzę mediainfo.

Innym przykładem użycia może być to, że przeskalowałeś wideo bt.601 do 1280 lub wyższej bez wykonania konwersji colormatrix (przy użyciu -vf colormatrix), gracze niepoprawnie przyjęliby bt.709, jeśli nie określisz informacji o kolorze.

Filtr colormatrixwideo FFMpeg obsługuje bt601matrycę kolorów wejściowych lub wyjściowych, ale nie ustawia także znaczników. (Ponieważ nie ma efektu ubocznego ustawiania opcji kolorów ffmpeg, odmawia nawet działania z src i dest tego samego, jak -vf colormatrix=bt601:bt601.)


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

oznaczy wyjściowe wideo jako za pomocą bt.709 dla yuv <-> rgb. Znaczniki kończą się w samym strumieniu bitów wideo, nie tylko w kontenerze (ponieważ wydaje się, że jest to coś specyficznego dla kodeka, a nie kontenera, przynajmniej dla kontenerów mp4 i mkv).

np. mediainfowyjście:

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

Więc bt.709 jest łatwy do tagowania. Problem polega na tym, że nigdzie nie widzę bt.601. Czy jedna z innych nazw jest dla niej pseudonimem, czy też naprawdę nie ma sposobu, aby podać to wprost?

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 pokazuje ten sam zestaw opcji dla opcji kolorów, które -c:v libx264kodek wideo ffmpeg przekazuje na x264. Czy któryś z nich jest aliasem dla bt.601, czy ma numerycznie równoważną matrycę kolorów?

Peter Cordes
źródło
Mam dokładnie ten sam problem. Czy wymyśliłeś linię poleceń, aby oznaczyć materiał HD h264 tagiem BT.601?
Casper
@Casper: tak, zaakceptowałem odpowiedź Mulvya, ponieważ było mnóstwo informacji, aby znaleźć odpowiednie opcje. Dokonałem edycji, aby wyraźnie uwzględnić odpowiednie opcje (np. NTSC jest -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Peter Cordes,

Odpowiedzi:

12

PAL i NTSC mają różne kolory podstawowe, więc

NTSC = SMPTE 170 M = BT 601525

PAL = BT 470 BG = BT 601625

Zobacz wiersze dla wartości 5 i 6 w tabeli na stronie 387 aktywnego standardu H.264 .


Tak więc odpowiednie argumenty dla ffmpeg to:

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

KUMPEL:

-color_trcnie akceptuje bt470bg, ale ffmpeg -h fullpokazuje, że gamma28oznacza to „BT.470 BG” dla tej opcji.

# 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

-colorspacejest najważniejszą opcją; pozostałe nie mają widocznej różnicy dla odtwarzaczy oprogramowania, takich jak mpvLinux.

Gyan
źródło
Ach, oczywiście. Patrzyłem nawet na stronę wikipedii bt601 i nie podchodziłem do stołu z dwoma rzędami. Derp.
Peter Cordes,
Dla tych, którzy chcą zrobić to samo ustawienie z HandBrake, w zakładce Wideo, w polu edycji Dodatkowe opcje, wprowadź ten ciąg: „colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m”
pcunite