
Я использую следующий код для создания нескольких PNG-файлов разной длительности и наложения их на другое видео.
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
Однако я обнаружил нечто очень странное. Файлы PNG, упомянутые в файле .txt, в основном прозрачны, за исключением полосы внизу, которая составляет около 300 пикселей или около того. ЕСЛИ эта полоса темно-серая, все работает отлично.
ЕСЛИ эта полоса красная, возможно, многие изображения или кадры потеряны.
Кроме того, я заметил, что скрипт работает по-разному в зависимости от того, красная полоса или темно-серая. Если она красная, то обработка строк больше, а если темно-серая, то похоже, что одно и то же кодирование происходит в одной строке обработки.
решение1
Не все PNG имеют одинаковый формат пикселей. Я вижу, что он чередуется между rgba и pal8 (8-битная палитра). Когда входные данные меняют свои свойства на полпути, ffmpeg повторно инициализирует фильтры. Когда это происходит, все буферизованные кадры отбрасываются.
Начиная с ffmpeg 4.2, есть возможность предотвратить повторную инициализацию. В этом случае формат пикселей необходимо вручную гармонизировать. Для более старых версий можно создать промежуточную версию с тем же форматом пикселей.
Начиная с ffmpeg 4.2, вы можете запустить
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
Для более старых версий сначала создайте промежуточный файл,
ffmpeg -safe 0 -f concat -i overlap-png.txt -copyts -c:v png -pix_fmt rgba -vsync 0 overlap.mov
а затем выполните исходную команду.