ffmpeg: marquer explicitement h.264 comme bt.601, plutôt que de laisser non spécifié?

12

Je veux marquer la vidéo comme explicitement bt.601, plutôt que "non spécifié". Je sais que les joueurs choisissent généralement bt.601 comme valeur par défaut pour les vidéos de moins de 1280 pixels de large, mais je tiens à préciser que bt.601 est la matrice de couleurs correcte pour une vidéo.

Le problème est qu'il n'y a pas d' bt601option pour ffmpeg ou libx264, seulement bt709 et quelques autres.

J'ai des vidéos qui ont été réduites de la HD et qui sont toujours en bt.709, mais qui ne sont pas correctement marquées. Donc, lorsque je regarde une vidéo, je dois parfois basculer manuellement mon lecteur sur bt.709 . Marquer explicitement comme bt.601 communiquera aux futurs téléspectateurs (par exemple moi-même) que c'est définitivement bt.601, et pas une vidéo bt.709 mal étiquetée, quand je la regarde avec mediainfo.

Un autre cas d'utilisation serait que si vous convertissiez une vidéo bt.601 en 1280 ou plus sans faire une conversion colormatrix (en utilisant -vf colormatrix), les joueurs supposeraient à tort bt.709 si vous laissiez les informations de couleur non spécifiées.

Le colormatrixfiltre vidéo de FFMpeg prend en charge bt601une matrice de couleurs d'entrée ou de sortie, mais ne définit pas également de balises. (Comme il n'a pas pour effet secondaire de définir les options de couleur de ffmpeg, il refuse même de fonctionner avec src et dest de la même manière -vf colormatrix=bt601:bt601.)


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

marquera la vidéo de sortie comme utilisant bt.709 pour yuv <-> rgb. Les balises se retrouvent à l'intérieur du flux vidéo lui-même, pas seulement dans le conteneur (car cela semble être une chose spécifique au codec, pas une chose de conteneur, pour les conteneurs mp4 et mkv au moins).

par exemple mediainfosortie:

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

Donc bt.709 est facile à étiqueter. Le problème est que je ne vois bt.601 nulle part. L'un des autres noms est-il un alias ou n'y a-t-il vraiment aucun moyen de le spécifier explicitement?

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 montre le même ensemble d'options pour ses options de couleur, que le -c:v libx264codec vidéo de ffmpeg transmet à x264. L'un d'entre eux est-il un alias pour bt.601, ou a-t-il une matrice de couleurs numériquement équivalente?

Peter Cordes
la source
J'ai exactement le même problème. Avez-vous trouvé la ligne de commande à utiliser pour obtenir des séquences HD h264 marquées avec BT.601?
Casper
@Casper: oui, j'ai accepté la réponse de Mulvya car il y avait beaucoup d'informations pour rechercher les bonnes options. J'ai fait une modification pour inclure explicitement les bonnes options (par exemple NTSC -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Peter Cordes

Réponses:

12

PAL et NTSC ont des couleurs primaires différentes, donc

NTSC = SMPTE 170M = BT 601525

PAL = BT 470 BG = BT 601 625

Voir les lignes pour les valeurs 5 et 6 dans le tableau à la page 387 de la norme H.264 active .


Les bons arguments pour ffmpeg sont donc:

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

COPAIN:

-color_trcn'accepte pas bt470bg, mais ffmpeg -h fullmontre que cela gamma28signifie "BT.470 BG" pour cette option.

# 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

-colorspaceest l'option la plus importante; les autres ne font pas de différence visible pour les joueurs comme mpvsur Linux.

Gyan
la source
Ah bien sûr. Je regardais même la page wikipedia de bt601, et je ne me suis pas aperçu du tableau ayant deux lignes. Derp.
Peter Cordes
Pour ceux qui cherchent à faire ce même réglage avec HandBrake, sous l'onglet Vidéo, à l'intérieur de la zone d'édition Options supplémentaires, entrez cette chaîne: "colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m"
pcunite