file logging encoding ffmpeg capacity-planning

file - ¿Cómo habilito el registro FFMPEG y dónde puedo encontrar el archivo de registro FFMPEG?



logging encoding (7)

Debe declarar el archivo de informe como variable para la consola.

El problema es que todos los documentos que puedes encontrar no se están ejecutando, así que ... me dieron 1 día de mi vida para encontrar el camino correcto ...

Ejemplo: para batch / consola

cmd.exe / K establece FFREPORT = archivo = ''C: / ffmpeg / proto / test.log'': nivel = 32 && C: / ffmpeg / bin / ffmpeg.exe -loglevel warning -report -i inputfile f outputfile

Ejemplo de Javascript:

var reortlogfile = "cmd.exe / K set FFREPORT = file = ''C: / ffmpeg / proto /" + filename + ".log'': level = 32 && C: / ffmpeg / bin / ffmpeg.exe" .... ...;

Puedes cambiar el directorio y el nombre de archivo como quieras.

Frank de berlín

Quiero poder registrar los procesos FFMPEG porque estoy tratando de calcular cuánto tiempo se tarda en convertir un minuto de video para ayudar a planificar la capacidad de mi servidor de codificación de video. ¿Cómo habilito el registro y dónde se guarda el archivo de registro? Tengo FFMPEG instalado en una máquina CentOS LAMP.


Encuentro la respuesta. 1 / Primero poner en los ajustes preestablecidos, tengo este ejemplo "Formato de salida MPEG2 DVD HQ"

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

Si desea un informe, incluya los comandos -vstats_file MFRfile.txt en los ajustes preestablecidos como en el ejemplo. Esto puede hacer un informe que está ubicado en la fuente de la carpeta de su fuente de archivo. puede poner cualquier nombre si lo desea, resolví mi problema "escribo muchas veces en este foro" leyendo un archivo .docx completo sobre las propiedades de mpeg. Finalmente puedo hacer mi barra de progreso leyendo este archivo txt generado.

Saludos.


FFmpeg no escribe en un archivo de registro específico, sino que envía su salida a un error estándar . Para capturar eso, necesitas

  • Capturalo y analízalo como se genera.
  • redirija el error estándar a un archivo y lea que luego el proceso finaliza

Ejemplo para la redirección de errores estándar:

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt

Una vez que el proceso está hecho, puede inspeccionar out.txt .

Es un poco más complicado hacer la primera opción, pero es posible. (Lo he hecho yo mismo. Al igual que otros. Eche un vistazo a SO y la red para obtener más detalles).


He encontrado las cosas de abajo en documentos ffmpeg. ¡Espero que esto ayude! :)

Referencia: http://ffmpeg.org/ffmpeg.html#toc-Generic-options

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

Nota: establecer la variable de entorno FFREPORT en cualquier valor tiene el mismo efecto.


Parece que si añades esto a la línea de comando:

-loglevel debug

o

-loglevel verbose

Obtendrá una salida de depuración más detallada en la línea de comandos.


Si solo quiere saber cuánto tiempo tarda en ejecutarse el comando, puede considerar usar el comando de time . Usted, por ejemplo, usa el time ffmpeg -i myvideoofoneminute.aformat out.anotherformat


ffmpeg registra a stderr y puede iniciar sesión en un archivo con un nivel de registro diferente al de stderr. La opción de línea de comando -report no le da control del nombre del archivo de registro o del nivel de registro, por lo que es preferible establecer la variable de entorno.

( -v es un sinónimo de -loglevel . Ejecute ffmpeg -v help para ver los niveles. Ejecute ffmpeg -h full | less para ver TODO. O consulte los documentos en línea o sus páginas wiki como la guía de codificación h.264 ).

#!/bin/bash of=out.mkv FFREPORT="level=32:file=$of.log" ffmpeg -v verbose -i src.mp4 -c:a copy -preset slower -c:v libx264 -crf 21 "$of"

Eso modificará src.mp4 con x264 y establecerá el nivel de registro para stderr en "detallado", y el nivel de registro para out.mkv.log en "estado".

( AV_LOG_WARNING=24 , AV_LOG_INFO=32 , AV_LOG_VERBOSE=40 , etc.). El soporte para esto se agregó hace 2 años , por lo que necesita una versión no antigua de ffmpeg. (Siempre es una buena idea, por seguridad / correcciones de errores y aceleraciones)

Algunos códecs, como -c:v libx265 , escriben directamente en stderr en lugar de usar la infraestructura de registro de ffmpeg. Así que sus mensajes de registro no terminan en el archivo de informe. Supongo que esto es un error / TODO-list.

Para registrar stderr, mientras aún se ve en una terminal, puede usar tee(1) .

Si usa un nivel de registro que incluye actualizaciones de la línea de estado (la información predeterminada de -v info , o superior), se incluirán en el archivo de registro, separados por ^M (retorno de carro también conocido como /r ). No hay un nivel de registro que incluya estadísticas de codificador (como SSIM) pero no actualizaciones de línea de estado, por lo que la mejor opción es probablemente filtrar esa secuencia.

Si no quiere filtrar (por ejemplo, el archivo fps / bitrate en cada intervalo de actualización de estado está en el archivo), puede usar less -r para pasarlos directamente a su terminal para que pueda ver los archivos limpiamente. Si tiene registros .enc de varios codificaciones que desea less -r ++G *.enc , less -r ++G *.enc funciona muy bien. (++ G significa comenzar al final del archivo, para todos los archivos). Con teclas de una sola tecla como . y , para el archivo siguiente y el archivo anterior, puede hojear algunos archivos de registro muy bien. (Los enlaces por defecto son :n y :p ).

Si desea filtrar, sed ''s/.*/r//'' funciona perfectamente para la salida ffmpeg. (En el caso general, necesita algo como vt100.py , pero no solo para retornos de carro). Hay (al menos) dos formas de hacer esto con tee + sed: tee a / dev / tty y salida de tee pipe a sed, o usar una sustitución de proceso para hacer tee en un tubo a sed.

# pass stdout and stderr through to the terminal, ## and log a filtered version to a file (with only the last status-line update). of="$1-x265.mkv" ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |& # pipe stdout and stderr tee /dev/tty | sed ''s/.*/r//'' >> "$of.enc" ## or with process substitution where tee''s arg will be something like /dev/fd/123 ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |& tee >(sed ''s/.*/r//'' >> "$of.enc")

Para probar algunos parámetros de codificación diferentes, puede realizar una función como esta que usé recientemente para probar algunas cosas. Lo tenía todo en una sola línea para poder subirlo y editarlo fácilmente, pero lo desenfocaré aquí. (Es por eso que hay ; s al final de cada línea)

ffenc-testclip(){ # v should be set by the caller, to a vertical resolution. We scale to WxH, where W is a multiple of 8 (-vf scale=-8:$v) db=0; # convenient to use shell vars to encode settings that you want to include in the filename and the ffmpeg cmdline [email protected].${v}p.x265$pre.mkv; [[ -e "$of.enc" ]]&&echo "$of.enc exists"&&return; # early-out if the file exists # encode 25 seconds starting at 21m15s (or the keyframe before that) nice -14 ffmpeg -ss $((21*60+15)) -i src.mp4 -t 25 -map 0 -metadata title= -color_primaries bt709 -color_trc bt709 -colorspace bt709 -sws_flags lanczos+print_info -c:a copy -c:v libx265 -b:v 1500k -vf scale=-8:$v -preset $pre -ssim 1 -x265-params ssim=1:cu-stats=1:deblock=$db:aq-mode=1:lookahead-slices=0 "$of" |& tee /dev/tty | sed ''s/.*/r//'' >> "$of.enc"; } # and use it with nested loops like this. for pre in fast slow; do for v in 360 480 648 792;do ffenc-testclip ;done;done less -r ++G *.enc # -r is useful if you didn''t use sed

Tenga en cuenta que comprueba la existencia del archivo de video de salida para evitar arrojar basura adicional en el archivo de registro si ya existe. Aun así, utilicé y anexé ( >> ) redireccionar.

Sería "más limpio" escribir una función de shell que tomara argumentos en lugar de mirar las variables de shell, pero esto fue conveniente y fácil de escribir para mi propio uso. Por eso también ahorré espacio al no citar correctamente todas mis expansiones de variables. ( $v lugar de "$v" )