
我使用下面的程式碼來獲取一些不同持續時間的 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
然後運行原來的命令。