PNG 파일의 색상에 따라 다른 결과를 제공하는 FFMPEG 이미지 연결

PNG 파일의 색상에 따라 다른 결과를 제공하는 FFMPEG 이미지 연결

다음 코드를 사용하여 다양한 지속 시간의 여러 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

그런 다음 원래 명령을 실행하십시오.

관련 정보