Android電話で録画したビデオがいくつかあります。それらは非常に似ています。例:
私はそれらのそれぞれにこのフィルターを適用します:
ffmpeg -i original0.mp4 -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1" -threads 3 -preset ultrafast -strict -2 -y processed0.mp4`
結果:
結果のビデオは大丈夫です。次に、original0 -> original1 -> original2
、original1 -> original0 -> original2
などのさまざまな組み合わせでそれらを連結します。私はそれのためにこのコマンドを使用します:
ffmpeg -f concat -i tmp.txt -codec copy -threads 3 -strict -2 -y combination.mp4
processed0.mp4
とprocessed1.mp4
の任意の組み合わせが正常に機能します。しかし、組み合わせにprocessed2.mp4
を含めると、結果のビデオは壊れます。
proccesed0 -> processed1 -> processed2
)すべてのビデオは数秒間隔で同じ方法で記録され、元のビデオの同じ組み合わせが適切に機能します。だから私はoriginal2
またはprocessed2
の何が問題になっているのか、そしてそれを修正する方法を知りたいのですが?おそらく、フィルターを適用するときにいくつかのフラグを追加する必要がありますか?私の推測では、それはタイムスタンプが原因で発生します。
入力はフレームレートが異なり(ffmpeg
コンソール出力を参照)、MP4マルチプレクサは可変フレームレートをサポートしていないと思います。
次のいずれかを実行できます。
処理されたファイルと最終出力の両方に、Matroska(.mkv)などの異なるコンテナー形式を使用するか、または
fps
フィルターをフィルターグラフに追加して、処理された各ファイルに共通のフレームレートを与えます。
-filter_complex "crop=720:720:280:0, scale=640:640, transpose=1, fps=30"
-threads 3
および-strict -2
は、ストリームコピー時に何もしません(-c copy
)。
h.264エンコーダーであるlibx264は、デフォルトで最適なスレッド数を自動的に計算するため、特定の値を強制することは最適ではない可能性があります。
MP4に出力することを選択した場合は、最終的な出力コマンドに-movflags +faststart
を追加することを検討してください。プログレッシブダウンロードを介して表示する場合に役立ちます。それ以外の場合は、再生を開始する前にファイル全体を完全にダウンロードする必要があります。
コメントで、オーディオとビデオを別々にフィルタリングするとおっしゃいました。簡単な例が役立つ場合があります。
ffmpeg -i input0 -i input1 -filter_complex \
"[0:v]hflip,negate[bg]; \
[1:v]vflip,hue=s=0,scale=120:-1[fg]; \
[bg][fg]overlay[v]; \
[0:a]aphaser,flanger[a]" \
-map "[v]" -map "[a]" -movflags +faststart output.mp4