正確かつ高速なカットを実現するために、コピーとエンコードを 1 つの操作で組み合わせることはできますか?

正確かつ高速なカットを実現するために、コピーとエンコードを 1 つの操作で組み合わせることはできますか?

ffmpeg を搭載したビデオ カッターを多数試しましたが、すべて同じ問題があります。再エンコードしないと高速カスタマイズが正確ではありません。自分のアプリで多くの解決策を試しましたが、必要なものは何もありませんでした。そこで、この問題を解決するために次のアイデアを思いつきました。t1 から t2 で始まるチャックを含まない新しいビデオを生成したいとします。ffmpeg でこれを実行して、セグメント (t1、t2) を 3 つの部分に分割します。

  1. 部分 (t1-x, t1+y) は、部分 (t1, y) を正確にコピーできるように再エンコードする必要がある完全なエンコードされたブロックです。
  2. 部分 (t2-z、t3+w) は、部分 (z、t2) を正確にコピーできるように再エンコードする必要がある完全なエンコード ブロックです。
  3. 完全なエンコードされたブロックを含む中間部分 (y、z) は、そのままコピーできます。

次に、上記の手順で得られた 3 つの部分を結合します。最初の 2 つの部分は小さくなると予想されるため (そのうちの 1 つまたは両方が長さ 0 になる可能性がある)、再エンコード プロセスは高速になります。これにより、わずかに遅い操作で正確なカットが可能になりますが、それでも完全なビデオを再エンコードするよりもはるかに高速です。1 つのコマンドで複数のカットを実行できる場合は、フレームを 1 回走査するだけで、さらに高速になります。

では、ffmpeg を使って今日からでも実行できるでしょうか? あるいは、ffmpeg はすぐにこれをサポートできるようになりますか? 誰かがこれを適用して、その方法を教えてくれたり、ffmpeg チームのメンバーに言及してくれたり、とにかく彼らに届けてくれたりしてくれることを願っています。

答え1

Ffmpeg はパラメータを使用したキーフレームのカット機能をサポートしていますssが、その位置が最も重要です。

キーフレームシークの例:

ffmpeg -ss 30 -i input_vid.mp4 -t 60 -c copy output_clip.mp4

全フレームシークの例:

ffmpeg -i input_vid.mp4 -ss 30 -t 60 -c copy output_clip.mp4

ここでのパラメータは-copy重要であるため、 ストリームコピー場合によっては、パラメータを追加する必要があります-noaccurate_seek

詳細については、以下を参照してください。


ほとんどのビデオは時間圧縮を実行するコーデックを使用しているため、指定されたカットポイントは、そのカットポイントの前 (および後) のフレームが正しくデコードされるかどうかに依存する場合があります。そのため、ffmpeg を使用してモードでビデオをトリミングする場合copy、ffmpeg は、セグメントを正しくデコードするために必要な、トリミングされたセグメントの前後のすべてのフレームを含める必要があります。これにより、開始セグメントが黒くなる可能性があります。

コピー モードを使用しながら黒いセグメントを回避するには、スイッチを設定する必要があります-avoid_negative_ts

関連情報