ffmpegを使用してビデオをカットする


333

ffmpegを使用して、次のような大きなファイルのセクションを切り取ります。

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ss一部が正常に動作しますが、-t無視されます。で指定された最初の指定された秒を正しく削除し-ssますが、コピーで入力の最後まで進みます。

ffmpegを使用して、ビデオを再コーディングせずに終了する方法はありますか?


1
この構文は正しいです。
jiggunjer

回答:


394

-ssオプションを使用して開始タイムスタンプを指定し、オプションを使用し-tてエンコード期間を指定できます。タイムスタンプは、HH:MM:SS.xxx形式または秒(s.msec)である必要があります。

次の例では、最初の30秒がクリップされ、その後10秒であるすべてのものがクリップされます。

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

-tは出力オプションであり、常にの に指定する必要があることに注意してください-i

いくつかのヒント:

  • 古いffmpegバージョンの場合、-ssafter を使用する-iと、実行速度が遅くなりますが、より正確にシークできます。参照:FFmpegを使用したシーク
  • -to代わりに使用-tして、カットするタイムスタンプを指定できます。そのため、同じことを達成するために-i <input> -ss 30 -t 10あなたの代わりに行うこともできます-i <input> -ss 30 -to 40

  • ffmpegが-c、またはをサポートしていない場合、-to非常に古い可能性があります。自分で新しいバージョンをコンパイルするか、ホームページから静的ビルドダウンロードします。本当に複雑ではありません。


1
@Mondain実際には、後に-ssを付けるとより正確になります。slhckはこれをblog.superuser.com/2012/02/24/で言及しています。 -ssの ffmpegのドキュメントでも、前後に置くことの違いについて言及しています。
barlop

5
+1は、私が最初の35秒後にすべてのものを無視する方法を見つけ出すためにここに来ました、ありがとう:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
これは私には機能しません(mp4)。5秒の黒い画面が生成されるだけですframe= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
。–時計職人

2
これにより、ビデオクリップの最初に3〜4秒の黒い画面が生成されました。省略によるクリスの修正により-c copy、最初の黒い画面が削除されました。詳細については、彼の答えを参照してください。
joelostblom

4
「次の例では、最初の30秒がクリップされ、その後10秒のすべてがクリップされます。」<-それはどういう意味ですか?クリップとは、含めるという意味ですか?'cosクリップはクリップアウトを意味します。あなたが含むことを意味すると仮定します。30秒から開始し、そこからわずか10秒を含めますか?もしそうなら、私はあなたがそれがはるかに明確になるだろうと書くことをお勧めします。
barlop

94

他の人が言ったように、-ss前に置く(はるかに高速)または後に(より正確に)置く-iことは大きな違いになります。ffmpegのシークページの「高速かつ正確なシーク」セクションでは、両方を取得する方法を説明しています。私はそれを使用しましたが、大きな違いをもたらします。基本的に、の-ss前後に配置する-iだけで、別のキーフレームを作成するためにカットを開始する場所の前に十分な時間を置いてください。例:Video.mp4で9min0secから10min 0secまでの1分間のクリップを作成する場合は、次を使用してすばやく正確に行うことができます。

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

最初-ssは(約)8分0秒まで高速にシークし、2番目-ssは9分0秒まで正確にシークし、-t 00:01:001分0秒のクリップを取り出します。

また、そのページのこの重要な点に注意してください。「で使用-ssする場合-c:v copy、ffmpegはiフレームでのみ使用/分割を強制されるため、結果のビットストリームが途切れたり、再生できなかったり、オーディオストリームと同期しなくなることがあります。 」

これは、単にコピーしたい場合でも、ビデオを再エンコードする必要があることを意味します。-c copy最初に試すこともできますが、動画がうまくいかない場合は、やり直す必要があります。


-c:a copyこのシーク方法にも同じ警告が適用されます。
ジグガンジャー

1
最良の答えは、この方法が私にとって最高の働きをしました。
オンドラŽižka16年

3
「-ss」は、ffmpeg 2.1+では2回指定せずに高速かつ正確になりました。 trac.ffmpeg.org/wiki/Seeking
コンラッドマイヤー

25

-ss組み合わせた-c copy結果、開始時に0.5秒のチョップが発生しました。

それを避けるには、-c copy(明らかにトランスコードを行う)を削除する必要があります。


4
精度を扱う別の答えがあります。多くの場合、デフォルトオプションでの再エンコードは、あなたがしたいことではありません!
トマスガンドール

良い点@TomaszGandor
クリス

1
@TomaszGandorの返事をまったく理解していませんでしたが、削除すると-c copy修正されました。
ユリアンオノフレイ

14

手動で

フレームアドバンスごとにフレーム化するメディアプレーヤーでファイルを開き、次のようなデータを含むAVISynthファイルを再生します

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

次に、正確な時間形式でカットします。

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

そして

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

次のような内容のビデオファイルを含むtxtファイルを作成します。

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

ffmpegを実行します。

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

私にとって-tオプションは機能しませんでしたが、-vframes機能しました。を使用することを好みます#frames。なぜなら、私はむしろI-Framesでカットし、ビデオを使用するGOPを見つけたからffprobeです。

私のために働いたコマンドラインは次のとおりです:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

ちなみに、-ss先頭に置く-iと実行時間に大きな違いが生じます。


1
出力オプションであるため、実際には-vframes(または-frames:v)後になるはず-iです。
slhck

5

user225366と同様に、-tオプションは短いビデオでは機能しませんが、長いビデオでは機能します。短い動画の場合、-frames:vの方が優れているようです。これは私のために働いたものです。

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

他の回答が示すように、ビデオに音声がある場合は、-acodecコピーを追加する必要があります。


0

これに言及している人はあまりいませんが(私は専門家ではないので、キャッチがあるかもしれません)、ファイルに字幕などの他のストリームやチャプターなどのメタデータがある場合、すべてのストリームをカット/トリムして保持することができます次のコマンド

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

では-map 0、あなたは、ファイル内のすべてのストリームを取る、として-c copy、彼らがそうであるように、あなたはそれらすべてをコピーします。開始ビア
-to省略する-ssと、入力ビデオが開始から2番目の60にカットされます。

いじるは、map特定のストリームのみをカットに保持する場合にも役立ちます(ファイル内のすべてのオーディオソースや一部の字幕のみが必要ない場合があります)。

FAT32ストレージに保存できない大きなMKVファイルを分割する必要がある場合に使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.