ffmpeg: ¿etiqueta explícitamente h.264 como bt.601, en lugar de dejarlo sin especificar?

12

Quiero etiquetar el video como explícitamente bt.601, en lugar de "no especificado". Sé que los jugadores suelen elegir bt.601 como predeterminado para videos de menos de 1280 píxeles de ancho, pero quiero dejar en claro que bt.601 es la matriz de color correcta para un video.

El problema es que no hay bt601opción para ffmpeg o libx264, solo bt709 y algunos otros.

Tengo algunos videos que se redujeron de HD, y todavía están en bt.709, pero no están etiquetados correctamente. Entonces, cuando veo un video, a veces tengo que alternar manualmente mi reproductor a bt.709 . Etiquetar explícitamente como bt.601 comunicará a los futuros espectadores (por ejemplo, a mí mismo) que definitivamente es bt.601, y no un video bt.709 mal etiquetado, cuando lo miro mediainfo.

Otro caso de uso para esto sería si elevara un video bt.601 a 1280 o superior sin hacer una conversión de matriz de colores (usando -vf colormatrix), los jugadores asumirían incorrectamente bt.709 si dejaba la información de color sin especificar.

El colormatrixfiltro de video de FFMpeg es compatible bt601como una matriz de color de entrada o salida, pero tampoco establece etiquetas. (Como no tiene el efecto secundario de configurar las opciones de color de ffmpeg, se niega incluso a operar con src y dest de la misma manera -vf colormatrix=bt601:bt601).


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

etiquetará el video de salida como bt.709 para yuv <-> rgb. Las etiquetas terminan dentro del flujo de bits de video en sí, no solo en el contenedor (ya que esto parece ser una cosa específica del códec, no una cosa de contenedor, para contenedores mp4 y mkv al menos).

por ejemplo, mediainfosalida:

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

Entonces bt.709 es fácil de etiquetar. El problema es que no veo bt.601 en ningún lado. ¿Es uno de los otros nombres un alias para él, o realmente no hay forma de especificarlo explícitamente?

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 muestra el mismo conjunto de opciones para sus opciones de color, que el -c:v libx264códec de video de ffmpeg pasa a x264. ¿Alguno de estos es un alias para bt.601 o tiene una matriz de color numéricamente equivalente?

Peter Cordes
fuente
Tengo exactamente el mismo problema. ¿Descubriste la línea de comando para usar para obtener imágenes HD h264 etiquetadas con BT.601?
Casper el
@Casper: sí, acepté la respuesta de Mulvya porque era mucha información para buscar las opciones correctas. Hice una edición para incluir las opciones correctas explícitamente (por ejemplo, NTSC es -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Peter Cordes

Respuestas:

12

PAL y NTSC tienen colores primarios diferentes, así que

NTSC = SMPTE 170M = BT 601525

PAL = BT 470 BG = BT 601 625

Vea las filas para los valores 5 y 6 en la tabla en la página 387 del estándar H.264 activo .


Entonces los argumentos correctos para ffmpeg son:

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

CAMARADA:

-color_trcno acepta bt470bg, pero ffmpeg -h fullmuestra que gamma28significa "BT.470 BG" para esa opción.

# 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

-colorspacees la opción más importante; los otros no hacen una diferencia visible para los jugadores de software como mpven Linux.

Gyan
fuente
Ah por supuesto. Incluso estaba mirando la página de la wikipedia bt601, y no tenía idea de que la tabla tenía dos filas. Derp.
Peter Cordes
Para aquellos que buscan hacer esta misma configuración con HandBrake, en la pestaña Video, dentro del cuadro de edición Opciones adicionales, ingrese esta cadena: "colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m"
pcunite