ffmpeg: etiqueta explicitamente h.264 como bt.601, em vez de deixar não especificado?

12

Quero marcar o vídeo como explicitamente bt.601, em vez de "não especificado". Sei que os players geralmente escolhem o bt.601 como o padrão para vídeos com menos de 1280 pixels de largura, mas quero deixar explícito que o bt.601 é a matriz de cores correta para um vídeo.

O ponto de discórdia é que não há bt601opção para ffmpeg ou libx264, apenas bt709 e algumas outras.

Tenho alguns vídeos que foram reduzidos em HD e ainda estão no bt.709, mas não estão marcados corretamente. Então, quando assisto a um vídeo, às vezes tenho que alternar manualmente meu player para bt.709 . Etiquetar explicitamente como bt.601 comunicará aos futuros espectadores (por exemplo, a mim mesmo) que é definitivamente o bt.601, e não um vídeo bt.709 com etiqueta incorreta, quando olhar para ele mediainfo.

Outro caso de uso para isso seria se você escalasse um vídeo bt.601 para 1280 ou superior sem fazer uma conversão de -vf colormatrixmatriz de cores (usando ), os jogadores assumiriam incorretamente o bt.709 se você deixasse as informações de cores não especificadas.

O colormatrixfiltro de vídeo do FFMpeg é compatível bt601com uma matriz de cores de entrada ou saída, mas também não define tags. (Como não tem o efeito colateral de definir as opções de cores do ffmpeg, ele se recusa a operar com src e a destar o mesmo, por exemplo -vf colormatrix=bt601:bt601).


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

marcará o vídeo de saída como usando bt.709 para yuv <-> rgb. As tags acabam dentro do próprio fluxo de bits de vídeo, não apenas no contêiner (já que isso parece ser algo específico de codec, e não contêiner, para contêineres mp4 e mkv).

por exemplo, mediainfosaída:

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

Portanto, o bt.709 é fácil de etiquetar. O problema é que não vejo o bt.601 em lugar nenhum. Um dos outros nomes é um alias para ele ou não há realmente nenhuma maneira de especificá-lo explicitamente?

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 mostra o mesmo conjunto de opções para suas opções de cores, que o -c:v libx264codec de vídeo do ffmpeg passa para x264. Algum desses nomes é alternativo para bt.601 ou possui uma matriz de cores numericamente equivalente?

Peter Cordes
fonte
Tenho exatamente o mesmo problema. Você descobriu a linha de comando a ser usada para obter imagens em HD do h264 marcadas com BT.601?
Casper
@ Casper: sim, aceitei a resposta de Mulvya porque havia muitas informações para procurar as opções certas. Fiz uma edição para incluir explicitamente as opções corretas (por exemplo, NTSC -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Peter Cordes

Respostas:

12

PAL e NTSC têm cores primárias diferentes, então

NTSC = SMPTE 170M = BT 601 525

PAL = BT 470 BG = BT 601 625

Veja as linhas dos valores 5 e 6 na tabela na página 387 do padrão H.264 ativo .


Portanto, os argumentos certos para o ffmpeg são:

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

AMIGO:

-color_trcnão aceita bt470bg, mas ffmpeg -h fullmostra que gamma28significa "BT.470 BG" para essa opção.

# 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é a opção mais importante; os outros não fazem uma diferença visível para jogadores de software como mpvno Linux.

Gyan
fonte
Ah é claro. Eu estava até olhando para a página da bt601 na Wikipedia e não percebi da tabela com duas linhas. Derp.
Peter Cordes
Para aqueles que procuram fazer a mesma configuração com HandBrake, sob a guia Vídeo, dentro da caixa de edição Opções extra, entrar neste string: "colorprim = smpte170m: Transferência = smpte170m: ColorMatrix = smpte170m"
pcunite