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

こちらも参照

ファイルを連結してつなげる場合はこちらを参照
concat を使い分ける

コマンド例

  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

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

  • やらかし

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

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

(20200512作業メモ) ffmpeg で動画を分割 – kondolab へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

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