¿Cómo calcular la longitud del archivo de video que se codificó hasta ahora?

Estoy usando ffmpegpara convertir un archivo de video al formato H.264. Si llamo ffprobemientras ffmpegtodavía se está ejecutando, no se sabe la duración del video. Solo cuando ffmpegfinalice ffprobese mostrará la duración.

De manera similar, si corro mplayerpara reproducir el video mientras aún se está codificando, la duración es desconocida o se muestra incorrectamente.

¿Hay alguna manera de saber la duración del video resultante (h264 en el contenedor .mkv) mientras todavía está siendo codificado por ffmpeg?

Editar : haré la pregunta un poco más clara.

Estoy interesado en saber cuánto dura el video que fue codificado hasta ahora . Digamos que el archivo de entrada tiene una duración de 1 minuto y 45 segundos. El archivo resultante debe conservar la longitud. Pero me gustaría saber cuánto ffmpegcodificó hasta ahora . Si podemos determinar la duración del video después de realizar la conversión, ¿no debería haber una forma de determinar la duración del video que ya fue procesado y listo para reproducirse?

Respuestas (2)

La respuesta corta es No.

La respuesta más larga es, depende.

Si está codificando un archivo, generalmente la salida es la duración de la entrada, a menos que se -ss, -to, -tapliquen opciones o filtros de ajuste o cambio de velocidad. Para una entrada en vivo, FFmpeg detendrá la codificación cuando encuentre EOF en la entrada, por lo que, a menos que sepa eso, no sabrá la duración de la salida. Para entradas múltiples de diferente duración, dependerá de cuál sea el comando, por ejemplo, ¿hay un -shortestallí? ¿Hay un amix?, que por defecto es la entrada más larga o amergeque termina con la entrada más corta.

De forma predeterminada, la lectura de la consola ffmpeg mostrará el progreso de la codificación en tiempo real, es decir, la duración codificada hasta el momento.

Gracias por la explicación. Edité mi pregunta y agregué algunos detalles, ¿podría verificarlo y ver si puede agregar más datos a su respuesta?
Como dice mi último párrafo, ffmpeg ya muestra esta información en la salida de la consola, que se transmite astderr
Esto es cierto. ¡Lo pasé por alto por completo! Gracias de nuevo.
Además, me gustaría agregar que hay una opción FFmpeg -progressque hace que genere la información de progreso antes mencionada en un formato amigable para la máquina que se puede analizar fácilmente.

Ver la -reportopción. De las páginas de manual:

-informe

Vuelque la línea de comandos completa y la salida de la consola en un archivo llamado " program-YYYYMMDD-HHMMSS.log " en el directorio actual. Este archivo puede ser útil para informes de errores. También implica " -loglevel verbose".

Establecer la variable FFREPORTde entorno en cualquier valor tiene el mismo efecto. Si el valor es una secuencia de valores clave separados por ' ' ,: estas opciones afectarán el informe; los valores de las opciones se deben escapar si contienen caracteres especiales o el delimitador de opciones ' ' (vea la sección ``Comillas y escapes'' en el manual de ffmpeg-utils).=:

Se reconocen las siguientes opciones:

expediente

establecer el nombre de archivo que se usará para el informe; %pse expande al nombre del programa, %tse expande a una marca de tiempo, " %%" se expande a un simple " %"

nivel

establezca el nivel de detalle del registro mediante un valor numérico (consulte " -loglevel").

Por ejemplo, para enviar un informe a un archivo llamado ffreport.log utilizando un nivel de registro de 32 (alias para el nivel de registro " info"):

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

Los errores al analizar la variable de entorno no son fatales y no aparecerán en el informe.

Combina con -statsy tu uno | head -n 2 | tail -n 1para llevar:

-estadísticas (globales)

Imprima el progreso/estadísticas de la codificación. Está activado de forma predeterminada, para deshabilitarlo explícitamente debe especificar " -nostats".

Si tiene problemas con su barra de progreso, que se usa \rpara reescribir la misma línea, puede usar ffmpeg -stats ... 2>&1 | tr \\r \\nhead&tail.