ffmpeg を搭載したビデオ カッターを多数試しましたが、すべて同じ問題があります。再エンコードしないと高速カスタマイズが正確ではありません。自分のアプリで多くの解決策を試しましたが、必要なものは何もありませんでした。そこで、この問題を解決するために次のアイデアを思いつきました。t1 から t2 で始まるチャックを含まない新しいビデオを生成したいとします。ffmpeg でこれを実行して、セグメント (t1、t2) を 3 つの部分に分割します。
- 部分 (t1-x, t1+y) は、部分 (t1, y) を正確にコピーできるように再エンコードする必要がある完全なエンコードされたブロックです。
- 部分 (t2-z、t3+w) は、部分 (z、t2) を正確にコピーできるように再エンコードする必要がある完全なエンコード ブロックです。
- 完全なエンコードされたブロックを含む中間部分 (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
。