コマンドライン – ffmpeg を使って動画を切り取る

command-line ffmpeg processing video

私はこのように大きなファイルの一部分を切り取るためにffmpegを使っています

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

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

ffmpegを使って、動画を再録せずに動画の最後を切り取る方法はありますか?

  430  Neil  2010-05-06


ベストアンサー

-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の後に指定する必要があることに注意してください

Some tips:

  • 古いバージョンの ffmpeg では、-i の後に -ss を使うと、実行速度が遅くなる代わりに、より正確なシークが可能になります。こちらも参照してください。FFmpeg を使ったシークも参照してください
  • カットしたいタイムスタンプを指定するには、-tの代わりに-toを使うことができます。つまり、-i <input> -ss 30 -t 10の代わりに-i <input> -ss 30 -to 40を使っても同じことができます

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

500  None  2010-05-15


他の人が言っていたように、-ss-iの前(より速く)に置くか、-ss-iの後(より正確に)に置くかで大きな違いが出てきます。ffmpegシークのページにある「高速で正確なシーク」のセクションには、両方の方法が書いてあり、私もそれを使ってみましたが、大きな違いがありました。基本的には、-ssの前と-iの後に-ssを置きます。例:-ss-iの間には十分な時間を空けてください。Video.mp4で9分0秒から10分0秒までの1分間のクリップを作りたい場合は、-ss-iの前に-ss-iの後に-ss-iを入れれば、素早く正確にカットできます

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:00は1分0秒のクリップを取り出す

また、このページの重要な点にも注意してください。”-ss-c:v copyと一緒に使うと、結果として得られるビットストリームがぎこちなくなったり、再生できなくなったり、オーディオストリームと同期しなくなったりする可能性があります

これは、ビデオをコピーしたい場合でも、ビデオを再エンコードする必要があることを意味します。最初に -c copy だけを試すことができますが、ビデオがクソの場合は、それをやり直す必要があります

133  seriesoftubes  2014-01-20


-ss-c copyを組み合わせると、スタート時に半秒チョップになることがわかりました

これを避けるためには、-c copyを削除しなければなりません (これは確かにトランスコードを行います)

31  Chris  2014-05-09


MANUALLY

フレーム単位でフレームを進めるメディアプレーヤーでファイルを開き、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)

その後、EXACTの時間形式でカットします

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"

and

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'

Run ffmpeg:

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

13  budman1  2014-09-04


私の場合は-tではうまくいかなかったのですが、-vframesではうまくいきました。I-Frameでカットしたいのと、#framesで動画のGOPがわかったので、ffprobeを使うことにしました

私が使っていたコマンドラインは

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

ちなみに、-ss-iの前に置くと実行時間に大きな差が出ます

8  Ben  2013-05-19


user225366と同様に、-tオプションは短い動画には使えませんが、長い動画には使えます。短い動画では-frames:vの方が良いようです。私の場合はこれが有効でした

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

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

5  VectorVortec  2016-12-08


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

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

-map 0ではファイル内の全てのストリームを取り込み、-c copyでは全てのストリームをそのままコピーします。 -to を使って -ss で開始部分を省略すると、入力ビデオは開始から 60 秒までカットされます

map をいじることは、特定のストリームだけをカットに残したい場合にも便利です(ファイル内のすべてのオーディオソースが必要ない場合や、いくつかの字幕だけが必要な場合など)

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

1  Gruber  2019-09-01


このフォーマットを使用します

ffmpeg <start time> <input file> <cut duration> <out file>

例えば、ビデオの1分後に60秒のクリップをカット

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

1  Zimba  2020-02-12


タイトルとURLをコピーしました