グレーはカットしない、つまり出力する部分で、ブラックがカットする部分。-c copyすれば無劣化になり、コーデックを指定すれば再エンコードになる。[duration]、[front-duration]、[back-duration]は秒時間指定と、hh:mm:ss.ms指定ができる。4番目はプレイヤで再生しているときの再生時間でカットするのに便利なコマンド。実際に時間を指定するときには[]を省略して秒指定、hh:mm:ss.ms指定する。

こちらも参照:

コマンド例

  1. 最初から最後まで出力する。つまりカットしない

    ffmpeg -i input.mp4 -c copy output.mp4

  2. 開始0秒から指定時間を出力する

    ffmpeg -i input.mp4 -t [duration] -c copy output.mp4

  3. 指定時間までカットし、最後まで出力する

    ffmpeg -ss [duration] -i input.mp4 -c copy output.mp4

  4. 指定時間までカットし、指定した再生時間まで出力する。ここのtoは秒時間よりも hh:mm:ss のほうが使いやすい

    ffmpeg -ss [duration] -to [hh:mm:ss] -i input.mp4 -c copy output.mp4

  5. 指定時間までカットし、指定区間を出力する

    ffmpeg -ss [duration] -i input.mp4 -t [duration] -c copy output.mp4

  6. 指定時間までカットし、最後も指定時間([back-duration]-[front-duration] )カットして出力する。詳しくはここ

    ffmpeg -ss [front-duration] -i input.mp4 -ss [back-duration] -i input.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy output.mp4

  7. 開始0秒から、最後から指定時間前まで出力する

    ffmpeg -i input.mp4 -ss [back-duration] -i input.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy output.mp4

  8. 最後から指定時間さかのぼり、最後まで出力する。sseofはマイナス時間を指定

    ffmpeg -sseof -[duration] -i input.mp4 -c copy output.mp4

  9. 最後から指定時間さかのぼり、指定時間を出力する

    ffmpeg -sseof -[duration] -i input.mp4 -t [duration] -c copy output.mp4

公式ドキュメント:ffmpeg Documentation : Main options

チャプターから分割する

チャプターから分割する方法はffmpegそれ自体にはないのでmkvmergeを用いる。
mkvmerge -o output.mkv --split chapters:all input.mkv

チャプターはメタデータで扱える。
ffmpeg でメタデータを加える

タイムスタンプを保持してカットする

コーデックコピーしたときに元の映像のタイムスタンプを保持するオプション-copytsと、開始時間が0秒ではない時に0秒にリセットするオプション-start_at_zeroがある。

  • -copytsは元の映像のPTSをそのまま保持する。
  • -start_at_zeroは映像の開始時間を0秒にリセットする。0秒開始ではないファイルはテレビ放送のTSやrtmpのFLVでよく見る。-copytsと併用すると入力ファイルの開始時間を0秒にして元のタイムスタンプを保持する。-start_at_zero単体では効果がない。
ffmpeg -i input.ts
	Duration: 00:02:34.72, start: 1.066722

動画時間はどれも20秒。
ffmpeg -ss 10 -t 20 -i input.ts -c copy out1.mp4
	Duration: 00:00:20.16, start: 0.000000
ffmpeg -ss 10 -t 20 -copyts -i input.ts -c copy out2.mp4
	Duration: 00:00:31.23, start: 11.009000(9.943000+1.066722=11.009722)
ffmpeg -ss 10 -t 20 -copyts -start_at_zero -i input.ts -c copy out3.mp4
	Duration: 00:00:30.16, start: 9.943000

後ろ-tにすると入力オプションにかかわらず、最初からの出力時間になる。2番目と3番目の動画時間は10秒。

ffmpeg -ss 10 -i input.ts -t 20 -c copy out4.mp4
	Duration: 00:00:20.16, start: 0.000000
ffmpeg -ss 10 -copyts -i input.ts -t 20 -c copy out5.mp4
	Duration: 00:00:20.12, start: 11.009000
ffmpeg -ss 10 -copyts -start_at_zero -i input.ts -t 20 -c copy out6.mp4
	Duration: 00:00:20.32, start: 9.943000

fftools/ffmpeg: fix -t inaccurate recording time · FFmpeg/FFmpeg@694545b
#9141 (Input option -t/-to totally ignored when stream copying MPEG-TS recorded from TV) – FFmpeg

TSファイルのカットに冒頭がズレるとき

-muxdelay 0をつけると改善するかも。
ffmpeg -ss 15 -to 1:45 -i input.ts -muxdelay 0 -c copy output.ts

似たオプションに-max_delayがあるが、こちらは同じ効果でミリ秒指定なのと入力オプションにも使える。

  • -max_delay integer (input/output)
    Set maximum muxing or demuxing delay in microseconds.
  • -muxdelay seconds (output)
    Set the maximum demux-decode delay.

ffmpeg Documentation : Advanced-options
What is the difference between max_delay and muxdelay in ffmpeg – Stack Overflow

指定トラックの同期時間を遅らせる

個別トラックのストリームを遅らせるには-itsoffsetを使う。1つのファイルの別ストリームを遅らせるなら同じファイルを2回読み込み、遅らせるストリームに-itsoffsetを使う。つまり先に始まるほうを1入力目に指定して遅らせる方を2入力目に指定する。

input.mp4の音声を0.5秒遅らせる。
ffmpeg -i input.mp4 -itsoffset 0.5 -i input.mp4 -map 0:v -map 1:a -c copy output.mp4

input.mp4の映像を0.5秒遅らせる。
ffmpeg -i input.mp4 -itsoffset 0.5 -i input.mp4 -map 1:v -map 0:a -c copy output.mp4

別ファイルの音声を0.5秒遅らせる。
ffmpeg -i input1.mp4 -itsoffset 0.5 -i input2.mp4 -map 0:v -map 1:a -c copy output.mp4

ffmpeg Documentation : Main options

11 thoughts on “ffmpeg で指定時間でカットするまとめ

  • やらかし

    毎度毎度質問ばかりで心苦しいのですが、ずっと悩み続け結果どうしようもなく書き込む事、お許しください

    windows版の話になります
    CropとTrimを同時にやろうとするとエラーに
    例:-ss 10 -t 1:00.89を指定、すると0.89というデレクトリーがないと言ったエラー表示
    時間の指定が間違っているのか?と何度見直しても時間指定は正しいはず…
    試しにTrim指定部分を外すと普通に出力
    Cropの指定部分を外しても同じく普通に出力
    しかし同時が行えません…
    知恵をお貸しください…

  • ti_aiuto

    おかげさまで動画編集ソフトだと何時間経っても終わる気配のなかった動画の切り貼りが数十秒で終わりました
    分かりやすい解説ありがとうございます

  • tetsu

    勉強させていただいております。

    末尾から指定時間(秒)を削除するコマンド例はありますでしょうか?
    例 (長さ5分から末尾の2秒を削除し4分58秒にする)

    • admin

      7の
      ffmpeg -i input.mp4 -ss 2 -i input.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy output.mp4

      がそれになります。1行処理を求めないなら動画時間を見て2の-tを使います。

    • admin

      先頭はキーフレーム始めしかコーデックコピーできないので-c:v libx264などのエンコーダを指定して再エンコードするしか、意図した正確な時間でカットできません。

  • kou

    なるほど…
    ほかのサイトで見た記事でやったときに妙に誤差が大きいと思ったら、-toの位置も-iの前に置くかどうかでffmpegの解釈が変わってしまうんですね
    ffmpeg -ss [duration] -i input.mp4 -to [hh:mm:ss] -c copy output.mp4
    では妙に大きく切り取ってしまっていたのですが
    ちゃんと
    ffmpeg -ss [duration] -to [hh:mm:ss] -i input.mp4 -c copy output.mp4
    とすることで正しく切り抜きが出来ました
    ありがとうございます

  • tom

    音ずれしないカット方法を調べていて、こちらを拝見しました。
    -ss -t の位置が音声のズレにも影響があるとは思いませんでした。ありがとうございました。

匿名 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)