
Estoy usando el siguiente código para tomar varios PNG de diferentes duraciones y superponerlos sobre otro video.
ffmpeg -safe -0 -f concat -i overlap-png.txt
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]fps=30[0v];[1v][0v]overlay=0:0"
-c:v libx264 -profile:v baseline -pix_fmt yuv420p
-level 3.1 -y finishedvideo.mp4
Sin embargo, he descubierto algo muy extraño. Los archivos PNG a los que se hace referencia en el archivo .txt son principalmente transparentes, excepto por una barra en la parte inferior que mide aproximadamente 300 píxeles. SI esa barra es gris oscuro, todo funciona perfectamente bien.
SI esa barra es roja, muchas de las imágenes se eliminan o posiblemente se eliminan fotogramas.
Además, noto que el script se ejecuta de manera diferente dependiendo de si la barra es roja o gris oscura. Si es rojo, hay más procesamiento línea por línea y si es gris oscuro, parece que ocurre la misma codificación en una línea de procesamiento.
Respuesta1
No todos los PNG tienen el mismo formato de píxel. Lo veo alternando entre rgba y pal8 (paleta de 8 bits). Cuando una entrada cambia sus propiedades a mitad de camino, ffmpeg reinicializa los filtros. Cuando eso sucede, los fotogramas almacenados en el búfer se eliminan.
Existe una opción, a partir de ffmpeg 4.2, para evitar la reinicialización. En este caso, el formato de píxeles debe armonizarse manualmente. Para versiones anteriores, se puede crear una versión intermedia con el mismo formato de píxeles.
A partir de ffmpeg 4.2, puede ejecutar
ffmpeg -safe 0 -f concat -reinit_filter 0 -i overlap-png.txt
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]null,format=rgba[0v];[1v][0v]overlay=0:0"
-c:v libx264 -profile:v baseline -pix_fmt yuv420p
-level 3.1 -y finishedvideo.mp4
Para versiones anteriores, primero cree un archivo intermedio,
ffmpeg -safe 0 -f concat -i overlap-png.txt -copyts -c:v png -pix_fmt rgba -vsync 0 overlap.mov
y luego ejecute su comando original.