
다음 코드를 사용하여 다양한 지속 시간의 여러 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
그런데 아주 이상한 점을 발견했습니다. .txt 파일에 참조된 PNG 파일은 하단에 약 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
그런 다음 원래 명령을 실행하십시오.