Concatenação de imagens FFMPEG fornecendo resultados diferentes com base nas cores do arquivo PNG

Concatenação de imagens FFMPEG fornecendo resultados diferentes com base nas cores do arquivo PNG

Estou usando o código a seguir para pegar vários PNGs de durações variadas e sobrepô-los em outro vídeo.

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

No entanto, descobri algo muito estranho. Os arquivos PNG mencionados no arquivo .txt são todos basicamente transparentes, exceto por uma barra na parte inferior com cerca de 300 pixels. SE essa barra estiver cinza escuro, tudo funciona perfeitamente bem.

SE essa barra estiver vermelha, muitas das imagens serão descartadas ou possivelmente os quadros serão descartados.

Além disso, noto que o script é executado de maneira diferente dependendo se a barra é vermelha ou cinza escuro. Se estiver vermelho, há mais processamento linha por linha e se estiver cinza escuro, parece que a mesma codificação acontece em uma linha de processamento.

Responder1

Nem todos os PNGs têm o mesmo formato de pixel. Vejo alternando entre rgba e pal8 (paleta de 8 bits). Quando uma entrada altera suas propriedades no meio do caminho, o ffmpeg reinicializa os filtros. Quando isso acontece, todos os quadros armazenados em buffer são descartados.

Existe uma opção, começando com ffmpeg 4.2, para evitar a reinicialização. Neste caso, o formato do pixel deve ser harmonizado manualmente. Para versões mais antigas, uma versão intermediária pode ser criada com o mesmo formato de pixel.

Começando com ffmpeg 4.2, você pode executar

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 versões mais antigas, primeiro crie um arquivo intermediário,

ffmpeg -safe 0 -f concat -i overlap-png.txt -copyts -c:v png -pix_fmt rgba -vsync 0 overlap.mov

e execute seu comando original.

informação relacionada