1. ホーム
  2. video

[解決済み] ffmpegを使って開始時刻と終了時刻を基準に動画をカットする

2022-03-20 01:15:20

質問内容

以下のコマンドで、動画の開始時刻と終了時刻を使って動画をカットしようとしました。

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

上記のコマンドを使って、動画を 00:00:03 から 00:00:08 . しかし、それはそれらの時間の間にビデオをカットしていないその代わりに、それは最初の11秒でビデオをカットしています。

編集 1:

で提案されている以下のコマンドでカットしてみました。 マーク4o

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

しかし、次のようなエラーが表示されました。

エンコーダ 'aac' は実験的ですが、実験的コーデックは有効ではありません。

を追加しました。 -strict -2 をコマンドに追加します。

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

これで正常に動作するようになりました。

解決方法は?

3秒のところにキーフレームがないのでしょう。 非キーフレームは他のフレームとの差分を符号化するため、前のキーフレームから始まるすべてのデータが必要です。

mp4コンテナでは、編集リストを使って再エンコードすることなく、非キーフレームでカットすることが可能です。 つまり、3秒前の最も近いキーフレームが0秒であれば、0秒から始まるビデオをコピーし、エディットリストを使ってプレーヤーに3秒後の再生を開始するように指示します。

を使用している場合は 最新のffmpeg は、あなたが提供したコマンドを実行すると、編集リストを使ってこれを行います。 これがうまくいかない場合は、古いバージョンのffmpegを使用しているか、使用しているプレーヤーがエディットリストをサポートしていないかのどちらかだと思われます。 プレイヤーによっては、エディットリストを無視して、常にファイル内のすべてのメディアを最初から最後まで再生するものもあります。

非キーフレームから正確にカットし、エディットリストをサポートしていないプレーヤーで希望のポイントから再生したい場合、またはカットされた部分が実際に出力ファイルに含まれないようにしたい場合(機密情報を含む場合など)、希望の開始時刻に正確にキーフレームが存在するように再エンコードすることで可能になります。 を指定しない場合、再エンコーディングがデフォルトとなります。 copy . 例えば

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

再エンコードするときに、品質関連の追加オプションや特定の AAC エンコーダを含めたいこともあるでしょう。 詳細については、ffmpeg の x264エンコーディングガイド ビデオと AACエンコーディングガイド は音声用です。

また -t オプションは、終了時刻ではなく、継続時間を指定します。 上記のコマンドは、3秒から始まる8秒間のビデオをエンコードする。 3秒から始めて8秒で終了するには -t 5 . 現在のバージョンのffmpegを使用している場合は、次のように置き換えることもできます。 -t-to を指定すると、指定した時刻に終了します。