ffmpeg: ¿Cómo copiar | extraer la configuración de codificación del archivo multimedia existente?

19

Deseaba poder hacer esto varias veces ahora, así que pregunto.

Si tengo un archivo de video o audio existente ffmpeg, mplayery otros reproductores de medios pueden detectar al menos algunas de sus "propiedades" como el contenedor, el códec y la velocidad de bits utilizada, probablemente varias configuraciones específicas de calidad y codificación, etc.

¿Cómo puedo extraer esta configuración de un archivo existente para usarla (directamente) para codificar con ffmpeg?

Por ejemplo, obtuve un mkvvideo codificado x264con algunas configuraciones y otro aviarchivo sin comprimir . Me gustaría "copiar" la configuración de codificación utilizada en el archivo x264 mkv para transcodificar el avi con la misma configuración.

Nota: Estoy buscando una manera que no incluya trabajo humano con "traducir" la configuración de un decodificador al codificador. Está bien si primero necesito extraer la configuración y guardarla en algún lugar, pero me gustaría poder simplemente alimentar las opciones de lectura a una línea de comando o un archivo de configuración preestablecido para ffmpeg.

n611x007
fuente
Bueno, probablemente podría ordenar a través de la salida ffprobe(sobre todo con el -show_streamsy -show_formatopciones) y utilizar esa información para la escritura de las cosas importantes
evilsoup
1
A menudo, usar la misma configuración, como la tasa de bits (intentar copiar la tasa de bits exacta parece ser popular entre los usuarios), no dará como resultado una calidad óptima. Por supuesto, no tengo idea de cómo es su entrada típica, pero con el uso x264 de la -crfopción generalmente se recomienda. Consulte la Guía de codificación FFmpeg y x264 .
llogan
No puedo encontrar nada sobre la configuración de codificación en la salida de ffprobe :(
thelolcat
Solo muestra el número de ReFrames, pero no la otra configuración como mediainfo
thelolcat
La sintaxis de entrada con ffmpeg es diferente de los campos de metadatos. por ejemplo, podría leer channels:6un archivo de video, pero para codificarlo necesitaría usar el interruptor -ch:6. Algunos conmutadores utilizan 1 letra, algunos utilizan dos, etc.
jiggunjer

Respuestas:

10

No hay forma automática de hacer eso. Debe mirar los parámetros del archivo original y aplicarlos al archivo de salida.

En la mayoría de los casos, estos serán los siguientes:

  • Formato de contenedor (MP4, MKV, ...)
  • Códec de video y audio (H.264, H.265, ...)
  • Audio específico:
    • Numero de canales de audio
    • Frecuencia de muestreo de audio
    • Bitrate de audio
  • Video específico:
    • Perfil y nivel (para garantizar la compatibilidad, ver aquí )
    • Limitaciones máximas de velocidad de bits (por ejemplo, para H.264 )
    • Resolución máxima de video, cambio a través de -filter:v scaleo-s:v
    • Framerate, cambio vía -filter:v fps -r
    • Submuestreo de croma, cambio vía -pix_fmt(por ejemplo, -pix_fmt yuv420pdebería darle la mejor compatibilidad)
    • Tamaño de GOP (distancia entre cuadros IDR), establecido a través de -g
    • Otras configuraciones de codificación específicas

Pero incluso si lo hace bien, algunos dispositivos pueden requerir información específica y patentada incrustada en el flujo de bits.


En cuanto a la tarea específica de usar x264, esto no será trivial. No conozco un solo script que se encargue de estas tareas, que generalmente se realizan manualmente. Para obtener la mayor información sobre la configuración de codificación, en Unix / Linux u OS X, puede usar mediainfoalgunos trucos de Bash.

Por ejemplo, para un video codificado x264 en un archivo MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Esto generará una lista de opciones x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Luego, podría pasar manualmente estas opciones al binario x264.

Si pasas por FFmpeg, eso es un poco más complicado, ya que no todas las opciones de x264 pueden o deben asignarse de esta manera. Tenga en cuenta que a menudo una simple especificación de preajuste, ajuste y perfil también funcionará (como se ve en x264 --fullhelpla guía de codificación x264 ), y especificar el nivel de CRF es suficiente.

Y esto ni siquiera está considerando el audio, donde afortunadamente no hay tantas opciones.

slhck
fuente
Entonces, ¿no es posible con ffprobe o ffmpeg?
thelolcat
No, no es directamente posible hacerlo con ffprobe / ffmpeg. En el caso de video codificado x264, usaría la mediainfosalida y mapearía estas opciones para ffmpeg -x264-params. (Consulte también la guía de codificación x264 ). Pero si desea una solución general para todo tipo de códecs / codificadores o formatos de contenedor, necesitará escribir un script moderadamente sofisticado que realice la conversión.
slhck