Конкатенация изображений FFMPEG, дающая разные результаты в зависимости от цветов в файле PNG

Конкатенация изображений FFMPEG, дающая разные результаты в зависимости от цветов в файле PNG

Я использую следующий код для создания нескольких 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

а затем выполните исходную команду.

Связанный контент