web-dev-qa-db-ja.com

FFMpegは特定のビデオを連結できません

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 -> original2original1 -> original0 -> original2などのさまざまな組み合わせでそれらを連結します。私はそれのためにこのコマンドを使用します:

ffmpeg -f concat -i tmp.txt -codec copy -threads 3 -strict -2 -y combination.mp4

processed0.mp4processed1.mp4の任意の組み合わせが正常に機能します。しかし、組み合わせにprocessed2.mp4を含めると、結果のビデオは壊れます。

すべてのビデオは数秒間隔で同じ方法で記録され、元のビデオの同じ組み合わせが適切に機能します。だから私はoriginal2またはprocessed2の何が問題になっているのか、そしてそれを修正する方法を知りたいのですが?おそらく、フィルターを適用するときにいくつかのフラグを追加する必要がありますか?私の推測では、それはタイムスタンプが原因で発生します。

2
user1049280

問題

入力はフレームレートが異なり(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
    
4
llogan