
次のコードを使用して、さまざまな継続時間の 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 行の処理で同じエンコードが行われているように見えます。
答え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
その後、元のコマンドを実行します。