2010-01-14 26 views

Respuesta

23

FFmpeg no escribe en un archivo de registro específico, sino que envía su salida a standard error. Para capturar eso, es necesario que sea

  • captura y analizarlo, ya que se genera
  • redirigir el error estándar a un archivo y leer que después se termina el proceso

Ejemplo para la redirección de error std :

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

Una vez que se realiza el proceso, puede inspeccionar out.txt.

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

+0

Si bien ffmpeg puede no proporcionar una opción para escribir archivos de registro, dependiendo de su códec y opciones, el codificador creará registros. Y eso puede ser muy perturbador, ya que está escrito donde se ejecutó, lo que puede generar problemas de permisos. En mi caso, era un problema con ** PHP ** y con '-pass 1/2'. – cregox

+1

@Stu Thompson, el problema aquí es que ffmpeg no produce salida de depuración normal a stderr cuando ffmpeg no se ejecuta desde una consola sino que se ejecuta programáticamente (comprueba si se trata de un TTY). – Tom

+0

@Tom: no tengo ese problema, mi código Java llama a FFmpeg programáticamente sin problemas. Y no soy el único. –

0

Si solo quiere saber cuánto tiempo le lleva ejecutar el comando, puede considerar usar el time mando. Por ejemplo, use time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

6

Encontré la respuesta. 1/Primer puesto en los preajustes, 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 incluye los comandos -vstats_file MFRfile.txt en los preajustes como el ejemplo. esto puede hacer un informe que está ubicando en la carpeta fuente de su archivo Fuente. puede poner cualquier nombre si lo desea, he resuelto mi problema "escribo muchas veces en este foro" leyendo un .docx completo sobre las propiedades de mpeg. finalmente puedo hacer mi barra de progreso leyendo este archivo txt generado.

Atentamente.

+0

+1 barra de progreso –

15

Encontré las cosas a continuación en ffmpeg Docs. ¡Espero que esto ayude! :)

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

‘-report’ Volcado de línea de comandos completa y salida de la consola en un archivo denominado programa -AAAAMMDD-HHMMSS.log en el directorio actual. Este archivo puede ser útil para informes de errores. También implica -loglevel verbose.

Nota: la configuración de la variable de entorno FFREPORT a cualquier valor tiene el mismo efecto .

+2

aparece en estos días FFREPORT también puede especificar un nombre de archivo de salida, vea http://stackoverflow.com/questions/11241878/ffmpeg-report-generation/14417386#14417386 también NB que al especificar "-report" establece automáticamente el registro al modo detallado, creo. – rogerdpack

+0

¿Puede usar -informar y cambiar el nivel de registro para depurar? – MarcusJ

+0

@MarcusJ: Sí, use 'of = out.mkv; FFREPORT = "level = 32: file = $ of.log" ffmpeg -v verbose ... "$ of" 'para establecer el nivel de registro para stderr a" verbose ", y el nivel de registro para' out.mkv.log' a "estado". ('AV_LOG_WARNING = 24',' AV_LOG_INFO = 32', 'AV_LOG_VERBOSE = 40'). El soporte para esto fue [agregado hace 2 años] (https: //trac.ffmpeg.org/ticket/3057 # comment: 5), por lo que necesita una versión no antigua de ffmpeg. –

3

parece que si se agrega esto a la línea de comandos:

-loglevel debug 

o

-loglevel verbose 

tiene un resultado de depuración más detallada a la línea de comandos.

0

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

El problema es que todo el Dokumentations se pueden encontrar no están funcionando de manera .. yo era dar 1 día de mi vida para encontrar el camino correcto ....

Ejemplo: para el lote/consola

cmd.exe/K set FFREPORT = archivo = 'C: \ ffmpeg \ proto \ test.log': nivel = 32 & & C: \ ffmpeg \ bin \ ffmpeg.exe -loglevel advertencia -registro -i archivo de entrada f archivo de salida

Ejemplo de Javascript:

var reortlogfile = "cmd.exe/K establecer FFREPORT = archivo = 'C: \ ffmpeg \ proto \" + nombre de archivo + ".log': nivel = 32 & & C: \ ffmpeg \ bin \ ffmpeg.exe" .. .....;

Puede cambiar el directorio y el nombre de archivo como desee.

Frank de Berlín

2

registros ffmpeg salida estándar de errores, y pueden conectarse a un archivo de registro con un nivel diferente de stderr. La opción de línea de comando -report no le da el control del nombre del archivo de registro o el nivel de registro, por lo que es preferible establecer la variable de entorno.

(-v es un sinónimo de -loglevel. Ejecutar ffmpeg -v help para ver los niveles. Ejecutar ffmpeg -h full | less para ver todo. O consultar el online docs, o sus páginas wiki como the h.264 encode guide).

#!/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 se TRANCODE src.mp4 con x264, y establecer el nivel de registro para stderr a "prolija", y el nivel de registro para out.mkv.log al "status".

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, etc.). El soporte para esto fue added 2 years ago, por lo que necesita una versión no antigua de ffmpeg. (Siempre es una buena idea de todos modos, para la seguridad/correcciones de errores y aceleraciones)


Unos codecs, como -c:v libx265, escribir directamente a stderr en lugar de utilizar la infraestructura de registro de ffmpeg. De modo que sus mensajes de registro no terminan en el archivo de informe. Supongo que es un elemento de error/lista TODO.

Para registrar stderr, al tiempo que lo ve en un terminal, puede usar tee(1).


Si utiliza un nivel de registro que incluye línea de estado actualiza (el valor por defecto -v info, o más alto), que se incluirá en el archivo de registro, separados (también conocido como retorno de carro \r) ^M. No hay ningún 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 desea filtrar (p. Ej.entonces el 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 .enc registros de varias codificaciones que desea hojear, less -r ++G *.enc funciona muy bien. (++ G significa comenzar al final del archivo, para todos los archivos). Con single-key key bindings como . y , para el siguiente archivo y el archivo anterior, puede hojear muy bien algunos archivos de registro. (los enlaces predeterminados son :n y :p).

Si quiere filtrar, sed 's/.*\r//' funciona perfectamente para la salida de ffmpeg. (En el caso general, necesita algo like 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 la salida de T de tubería en sed, o usa una sustitución de proceso para formar una T en una tubería 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 unos parámetros diferentes codificar, se puede hacer una función como éste que he usado recientemente para probar algunas cosas. Lo tenía todo en una línea, así que pude hacer una flecha arriba y editarlo, pero lo desactivo 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 

Nota que prueba la existencia del archivo de vídeo de salida para evitar arrojar basura adicional en el archivo de registro si ya existe. Aun así, utilicé y agregué (>>) redirigir.

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

Cuestiones relacionadas