Al codificar H.264 con ffmpeg, recibo el siguiente tipo de advertencias en masa:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
¿Qué quieren decir? No he encontrado nada claro en línea o en la documentación de ffmpeg.
Respuestas:
Estaba recibiendo miles de estas advertencias con una codificación particular. Estaba reduciendo el tamaño del video de 1080p a 480p. En un punto de edición, donde había un video dudoso debido a un defecto en el disco láser de origen, estos mensajes comenzaron a aparecer y luego aparecieron, creo, para cada cuadro a partir de entonces. Siguieron y siguieron, como este breve extracto:
La invocación original de ffmpeg fue esta:
Siguiendo las sugerencias aquí, primero agregué -framerate 60000/1001 a la entrada. Eso no mejoró nada. Retuve -framerate y agregué -r 60000/1001 a la salida. Eso todavía no mejoró nada. Reteniendo ambos, finalmente agregué -async 1 -vsync 1. Esto resultó en que recibí una sola advertencia, y eso es todo. Esa invocación fue:
La única diferencia que encontré en un volcado detallado de MediaInfo fue la eliminación de esta línea encontrada en la invocación original pero no en la segunda:
Sin embargo, verifiqué la sincronización de A / V cerca del comienzo de los archivos y cerca del final, y no hubo diferencias apreciables en la sincronización entre los dos archivos. Sus tiempos de ejecución también fueron los mismos, pero eso solo se midió al segundo más cercano, en VLC. Así que verifiqué los recuentos de cuadros usando ffmpeg así:
y buscando "frame = #" cerca del final de la salida.
Resulta que el video fuente tenía 375226 cuadros de largo, la invocación original produjo 375195 cuadros, y la segunda invocación produjo 375200. Entonces, la segunda invocación, con muchos menos mensajes de advertencia, también dejó caer 5 cuadros menos.
Las pruebas posteriores mostraron que -framerate y -r eran innecesarios, y solo usar los dos indicadores de sincronización era suficiente. Esto produjo resultados idénticos a la segunda invocación anterior, por lo que la tercera y más simple invocación que encontré para resolver el problema es esta:
Y otro archivo posteriormente produjo un montón de estas advertencias incluso con los indicadores de sincronización, pero al agregar nuevamente los indicadores de velocidad "lo arregló" (solo produjo dos en lugar de miles de advertencias). Entonces, a veces la segunda invocación funciona cuando la tercera no. Para mis propósitos inmediatos, me voy a conformar con la segunda invocación y espero que solucione la mayoría de estos problemas.
Todo esto con la versión 4.0 de ffmpeg.
fuente
-async 1 -vsync 1
arregló para mí.Uno de los encargados del proyecto DVDStyler en SourceForge dijo esto al respecto:
fuente
Este mensaje de advertencia aparece cuando se trata de codificar una fuente de alta velocidad de cuadros a una salida de baja velocidad de cuadros, lo que significa que los cuadros deben descartarse.
Tuve este error porque quería convertir una serie de imágenes en un video:
El problema parece ser que si no se proporciona una velocidad de cuadro para la entrada, se supone una velocidad de cuadro de 25 fps:
Esto también se puede ver en el número total de cuadros codificados. Tenía 400 imágenes, pero el comando anterior solo codificó 384:
Los mensajes de error desaparecen al establecer la velocidad de fotogramas de entrada si la velocidad de fotogramas de salida. La velocidad de fotogramas de salida se elegirá automáticamente para que sea la de la entrada. Además en las últimas versiones de ffmpeg hay que tener cuidado, porque al usar imágenes PNG con el
-i
la opción o bienimage2
ov4l2
formato de entrada, usted tiene que usar-framerate
en lugar de-r
, consulte la documentación de la-r
opción .También es posible especificar la velocidad de fotogramas de entrada y salida por separado:
En este caso, solo se codificarán 161/400 cuadros. Los otros cuadros provisionales se descartarán. También el mensaje de error desaparece, supongo que para no ralentizar ffmpeg enviando spam a stdout, vea:
fuente
-r
funcionó donde el uso-framerate
no lo hizo.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
a esto sin más advertenciasffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(tenga en cuenta lo-framerate 50
agregado como entrada)Mirando el código fuente observar , parece ser que la diferencia entre el tiempo de presentación (pts) en la secuencia de entrada difiere de la de la secuencia de salida en más de un límite fijo establecido en 0.6.
Fragmentos de la fuente:
...
Esto es solo un vistazo rápido, así que siéntase libre de cavar más profundo.
fuente
format_video_sync = VSYNC_DROP
oformat_video_sync = VSYNC_PASSTHROUGH
ver si uno de ellos es viable en tu caso de uso.-r
interruptor "reparó" estas advertencias.Según el problema FFmpeg # 4700 - Duración pasada 0.999992 demasiado grande , solo es una advertencia. Utilizar:
Para detenerlo
Ned
fuente
El comando en realidad debería ser:
No hay un prefijo "-" para el parámetro "silencioso", ya que no es una opción, sino un valor para la opción "-loglevel".
fuente