web-dev-qa-db-ja.com

Ffmpegを使用して開始時間と終了時間に基づいてビデオをカットする

次のコマンドを使用して、ビデオの開始時間と終了時間を使用してビデオをカットしようとしました

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:

mark4o で示唆されている次のコマンドを使ってカットしようとしました

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

今それはうまく働いています。

385
Kalai

おそらく3秒目にはキーフレームがありません。非キーフレームは他のフレームとの違いをエンコードするため、前のキーフレームから始まるすべてのデータが必要です。

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

Git masterから 最新の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に置き換えて、指定した時間に終了することもできます。

447
mark4o

これを使ってみてください。これは私が考え出した中で最も速くて最良のffmpeg-wayです。

 ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4

このコマンドはあなたのビデオを数秒でトリミングします!

私は私のブログでそれを説明しました ここ /:

-i: 入力ファイルを指定します。その場合、それは(input.mp4)です。
-ss: -iと共に使用すると、入力ファイル(input.mp4)内でpositionを探します。
00:01:00: これは、トリミングされたビデオが始まる時間です。
-to: 開始(00:01:40)から終了(00:02:12)までの時間を指定します。
00:02:00: これは、トリミングされたビデオが終わる時間です。
-c copy: これはストリームコピーでトリムするオプションです。 (注意:とても速い)

タイミングフォーマットは次のとおりです。hh:mm:ss

現在の非常に支持された回答は古くなっており、トリムは非常に遅くなることに注意してください。詳しくは、この公式のffmpeg article をご覧ください。

246
George Chalhoub
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

すぐに作成するには -c copy を使用してください。その場合、ffmpegはビデオを再エンコードするのではなく、サイズに合わせてカットします。

74
Vlad Hudnitsky
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

2秒3から8秒までを除くすべてをドロップします。

26
JFMD

ソースビデオの開始時間と終了時間に基づいてカットし、計算を行わないようにするには、入力オプションとして終了時間を指定し、出力オプションとして開始時間を指定します

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

これにより、0:45から1:00に15秒のカットが生成されます。

これは、-ssが出力オプションとして指定された場合、破棄された時間が依然として入力から読み取られた合計時間に含まれ、-tがいつ停止するかを知るために使用されるためです。一方、-ssinputオプションとして指定されている場合、開始時刻が検索され、カウントされません、これが混乱の原因です。

省略されたセグメントは破棄される前に処理されるため、シークよりも遅くなりますが、これが私の知る限り唯一の方法です。大きなファイル内の奥から切り取っている場合は、単に数学を実行し、入力に-ssを使用する方が賢明です。

15
Ryan Yoosefi