グレーはカットしない、つまり出力する部分で、ブラックがカットする部分。-c copyすれば無劣化になり、コーデックを指定すれば再エンコードになる。[duration]、[front-duration]、[back-duration]は秒時間指定と、hh:mm:ss.ms指定ができる。4番目はプレイヤで再生しているときの再生時間でカットするのに便利なコマンド。実際に時間を指定するときには[]を省略して秒指定、hh:mm:ss.ms指定する。
こちらも参照:
コマンド例
-
ffmpeg -i input.mp4 -c copy output.mp4
-
ffmpeg -i input.mp4 -t [duration] -c copy output.mp4
-
ffmpeg -ss [duration] -i input.mp4 -c copy output.mp4
-
ffmpeg -ss [duration] -to [hh:mm:ss] -i input.mp4 -c copy output.mp4
-
ffmpeg -ss [duration] -i input.mp4 -t [duration] -c copy output.mp4
-
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
-
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
-
ffmpeg -sseof -[duration] -i input.mp4 -c copy output.mp4
-
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 でメタデータを加える
- Windows用:Download MKVToolNix latest release
- ドキュメント:mkvmerge — Merge multimedia streams into a Matroska file
- ダウンロード先:MKVToolNix Downloads – Matroska tools for Linux/Unix and Windows
- そのほかの方法:Is there an elegant way to split a file by chapter using ffmpeg? – Stack Overflow
タイムスタンプを保持してカットする
コーデックコピーしたときに元の映像のタイムスタンプを保持するオプション-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
毎度毎度質問ばかりで心苦しいのですが、ずっと悩み続け結果どうしようもなく書き込む事、お許しください
windows版の話になります
CropとTrimを同時にやろうとするとエラーに
例:-ss 10 -t 1:00.89を指定、すると0.89というデレクトリーがないと言ったエラー表示
時間の指定が間違っているのか?と何度見直しても時間指定は正しいはず…
試しにTrim指定部分を外すと普通に出力
Cropの指定部分を外しても同じく普通に出力
しかし同時が行えません…
知恵をお貸しください…
例のコマンドをすべて書いてログも載せてくれないと答えられない。
長いようなら https://pastebin.com/ に貼ってください。
[…] このサイトを参考にしました。コマンドを記録します。 […]
おかげさまで動画編集ソフトだと何時間経っても終わる気配のなかった動画の切り貼りが数十秒で終わりました
分かりやすい解説ありがとうございます
[…] FFmpeg で指定時間でカットするまとめ | ニコラボ […]
勉強させていただいております。
末尾から指定時間(秒)を削除するコマンド例はありますでしょうか?
例 (長さ5分から末尾の2秒を削除し4分58秒にする)
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を使います。
-ssで指定した秒数がずれます。
改善方法を教えて下さい
先頭はキーフレーム始めしかコーデックコピーできないので-c:v libx264などのエンコーダを指定して再エンコードするしか、意図した正確な時間でカットできません。
なるほど…
ほかのサイトで見た記事でやったときに妙に誤差が大きいと思ったら、-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
とすることで正しく切り抜きが出来ました
ありがとうございます
音ずれしないカット方法を調べていて、こちらを拝見しました。
-ss -t の位置が音声のズレにも影響があるとは思いませんでした。ありがとうございました。