FFmpegでは -ss・-to・-t の3つのオプションを組み合わせて、特定のシーンを切り出したり、最初の30秒を削除したりできます。カット位置はミリ秒単位で指定できます。処理の速さを優先する方法と、カット位置の精度を優先する方法があります。
基本オプション早見表
| オプション | 配置位置 | 意味 | 例 |
|---|---|---|---|
-ss 開始位置 |
-i の前または後 |
処理開始位置(ファイルの先頭からの時間) | -ss 00:01:30 |
-to 終了位置 |
-i の前または後 |
処理終了位置(-i の前なら元ファイルの時刻。-i の後では出力の時刻なので、入力前 -ss と組み合わせると -ss からの長さになる) |
-to 00:03:00 |
-t 継続時間 |
-i の前または後 |
切り出す長さ(秒数または HH:MM:SS) | -t 90 |
-c copy |
出力オプション | 再エンコードなし・ストリームコピー | -c copy |
-avoid_negative_ts 1 |
出力オプション | タイムスタンプの負値回避(-c copy 時推奨) |
-avoid_negative_ts 1 |
-toと-tは同時に使えません。両方指定すると-tが優先されます(FFmpeg公式ドキュメント)。
時刻フォーマット
FFmpegの時刻指定には2種類の書き方が使えます。どちらでも同じ結果になります。
| 形式 | 例 | 意味 |
|---|---|---|
HH:MM:SS |
00:01:30 |
1分30秒 |
HH:MM:SS.mmm |
00:01:30.500 |
1分30秒500ミリ秒 |
| 秒数(小数可) | 90 または 90.5 |
90秒(90.5秒) |
編集ソフトによっては、フレーム番号や総秒数しか表示されません。その場合はタイムコード変換ツールで HH:MM:SS.mmm ↔ 秒数 ↔ フレーム番号を相互変換できます(ドロップフレーム対応)。
コマンド例
1. 基本:ストリームコピーで高速トリミング(速度優先)
再エンコードなしで切り出すため、数秒で処理が完了します。開始点はキーフレームに丸められます(後述)。
ffmpeg -ss 00:01:00 -to 00:03:00 -i input.mp4 -c copy output.mp4
-ss 00:01:00… 1分00秒から開始(入力前で高速シーク)-to 00:03:00… 3分00秒で終了(合計2分間を切り出し)。-iの前に置くと元ファイルの時刻になります。-iの後ろに置くと-ssからの長さとして扱われ、1:00〜4:00 の3分間になります-c copy… 映像・音声をそのままコピー(再エンコードなし)
# 開始1分30秒から60秒間を切り出す(-t で継続時間指定)
ffmpeg -ss 00:01:30 -i input.mp4 -t 60 -c copy output.mp4
2. 精確なフレームカット(精度優先・再エンコードあり)
入力前 -ss で高速にシークしてから再エンコードします。速度と精度のバランスが最も良い方法です。
ffmpeg -ss 00:00:30 -to 00:01:30 -i input.mp4 -c:v libx264 -crf 23 -preset fast -c:a aac output.mp4
-crf 23… H.264の品質(数値が小さいほど高品質。推奨値: 18〜28)-preset fast… エンコード速度と圧縮率のバランス
# 継続時間で指定する場合
ffmpeg -ss 00:02:00 -i input.mp4 -t 45 -c:v libx264 -crf 23 -preset fast -c:a aac output.mp4
3. 複数区間を一括切り出し(分割抽出)
同じ入力ファイルから複数クリップを同時に切り出します。FFmpegの複数出力機能を使うので入力ファイルの読み込みは1回で済みます。
ffmpeg -i input.mp4 \
-ss 00:00:10 -to 00:01:00 -c copy clip1.mp4 \
-ss 00:02:30 -to 00:03:15 -c copy clip2.mp4 \
-ss 00:05:00 -to 00:06:30 -c copy clip3.mp4
注意:出力前
-ssと-c copyの組み合わせなので、各クリップの映像は指定位置の後の最初のキーフレームから始まります(音声は指定位置から)。正確に切りたいときは、-c copyの代わりに-c:v libx264 -crf 23 -c:a aacで再エンコードします。
4. キーフレームの位置で切り出す(コピーのまま開始位置を正確に)
まず ffprobe でキーフレームのタイムスタンプを確認し、その位置に合わせて -ss を指定します。映像がちょうどその時刻から始まります。それ以外の時刻を指定すると、ストリームコピーでは手前のキーフレームからの部分も入り、MP4 の編集リストでその部分を隠す形になります(エラー5)。
# キーフレームのタイムスタンプを一覧表示
ffprobe -v quiet -select_streams v -skip_frame nokey \
-show_entries frame=pts_time,pict_type \
-of csv=p=0 input.mp4 | grep ",I"
出力例(I-フレーム = キーフレーム):
0.000000,I
2.002000,I
4.004000,I
...
キーフレームの位置(例: 上の出力のように 2.002 秒間隔なら 64.064 秒 = 00:01:04.064)を -ss に指定します。
ffmpeg -ss 00:01:04.064 -i input.mp4 -t 30 -c copy output.mp4
5. バッチトリミング(シェルスクリプト)
複数ファイルをまとめてトリミングする場合はループを使います。
#!/bin/bash
# 全 .mp4 を開始10秒から60秒間切り出してサムネイル確認用クリップを作成
for f in *.mp4; do
ffmpeg -ss 10 -i "$f" -t 60 -c copy "trimmed_${f}" -y
done
入力前 -ss vs 出力前 -ss
-ss を置く位置によって、トリミングの速度と精度が変わります。
入力前 -ss(推奨)
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
# ↑ -i の前
| 特性 | 詳細 |
|---|---|
| 仕組み | 指定時刻直前のキーフレームへ高速ジャンプ(fast seek) |
| 速度 | 非常に速い — 大容量ファイルでも数秒 |
| 精度 | キーフレーム境界に丸まるため、指定より0〜数秒手前から開始 |
| 推奨用途 | ストリームコピー(-c copy)での高速カット、レビュー用クリップ作成 |
出力前 -ss(低速・精確)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c:v libx264 -crf 23 -c:a aac output.mp4
# ↑ -i の後
| 特性 | 詳細 |
|---|---|
| 仕組み | ファイル先頭からデコードして指定フレームまで進む |
| 速度 | 遅い — 後半シーンでは数分かかることも |
| 精度 | フレーム単位で正確 |
| 推奨用途 | 再エンコードと組み合わせた精確カット(ただし入力前 -ss + 再エンコードの方が実用的) |
-c copyと組み合わせるとデコードしないので、映像は指定位置より後の最初のキーフレームから始まり(音声は指定位置から)、フレーム単位では切れません。
ストリームコピー vs 再エンコード 比較表
| 方法 | コマンド例 | 速度 | 精度 | ビットレート(1秒あたりのデータ量) |
|---|---|---|---|---|
| ストリームコピー(入力前 -ss) | -ss X -to Y -i in -c copy out |
★★★ | ★★☆ | 元のまま |
| 再エンコード(入力前 -ss) | -ss X -to Y -i in -c:v libx264 -crf 23 out |
★☆☆ | ★★★ | 変わる(設定次第) |
| 出力前 -ss + ストリームコピー | -i in -ss X -to Y -c copy out |
★★☆ | ★☆☆(映像は X の後のキーフレームから) | 元のまま |
実務上の推奨: 速度と精度のバランスが最も良いのは、入力前 -ss + -c:v libx264 -crf 23 です。
オプション詳解
-avoid_negative_ts 1
ストリームコピーで切り出した動画を一部のプレイヤーで再生したときに、冒頭の再生がおかしくなる問題を防ぎます。PTS(プレゼンテーションタイムスタンプ)が負の値になるのを避けます。
ffmpeg -ss 00:00:30 -i input.mp4 -t 60 -c copy -avoid_negative_ts 1 output.mp4
-copyts
入力のタイムスタンプをそのまま出力に引き継ぐオプションです。入力前 -ss と組み合わせると、-i の後の -to が元ファイルの時刻として扱われます。MP4 では先頭に -ss の分の空白区間が記録されるため、ふつうの切り出しには使いません。
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:01:30 -c copy -copyts clip.mp4
トラブルシューティング
エラー1: 出力の冒頭がブロックノイズだらけ
症状: -c copy で切り出した動画の最初の数秒間に緑や黒のブロックが出ます。
原因: -c copy の切り出しは必ずキーフレームから始まるので、ふつうは映像が崩れません。ブロックが出ることがあるのは、元の動画がオープン GOP の場合です。オープン GOP では、キーフレームの直後のフレームがそれより前の映像を参照していることがあり、その映像は切り出したファイルに入っていません。
解決策: 再エンコードします。
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c:v libx264 -crf 23 -c:a aac output.mp4
エラー2: -to を指定したのに期待の長さにならない
症状: -ss 00:01:00 -i input.mp4 -to 00:02:00 で1分間のつもりが、2分間の動画になります。
原因: 入力前に -ss を置くと、出力のタイムスタンプが 0 から数え直されます。-i の後の -to は出力の時刻で判定されるため、「-ss から2分間」という意味になります。
解決策: -to の代わりに -t(継続時間)を使うと、長さを明確に指定できます。-to を -i の前に置けば、元ファイルの時刻で終了位置を指定できます。
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c copy output.mp4
エラー3: 音声だけ残って映像がない(または逆)
症状: 出力ファイルを開くと、音声だけ、または映像だけになっています。
原因: 元ファイルに該当するストリームがないか、-an(音声除去)/-vn(映像除去)が意図せず使われています。
解決策:
# ストリーム確認
ffprobe -v quiet -show_streams input.mp4
# 音声を明示的にコピー
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c:v copy -c:a copy output.mp4
エラー4: Output file is empty, nothing was encoded
症状: エラーにならずに終わりますが、出力ファイルには映像も音声も入っていません(数百バイトしかありません)。
原因: -ss の値が動画の総尺を超えています。
解決策:
# まず総尺を確認
ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1 input.mp4
エラー5: -c copy で音声と映像がズレる
症状: 切り出した動画で、口の動きと音声が合いません。
原因: -c copy では映像をキーフレームからしか始められないため、映像は指定位置より手前のキーフレームから始まります。MP4 ではこの余分な部分を隠す情報(編集リスト)が書き込まれますが、プレーヤーがそれを正しく扱わないと音声とズレて見えます。
解決策: 映像も再エンコードします(またはキーフレームの位置で切り出します)。音声だけ再エンコードしても映像の開始位置は変わらないので直りません。
# 映像も再エンコードして、指定位置から正確に始める
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c:v libx264 -crf 23 -c:a aac output.mp4
FAQ
Q1. -ss と -to の両方を入力前に置けますか?
A. 置けます。-to は入力オプションとしても使えます。ffmpeg -ss 00:01:00 -to 00:03:00 -i input.mp4 -c copy output.mp4 のように両方を -i の前に置くと、元ファイルの 1:00〜3:00(2分間)を切り出します。-to を -i の後に置くと、入力前 -ss からの長さとして扱われます(エラー2)。
Q2. フレーム番号で指定することはできますか?
A. 直接フレーム番号は指定できませんが、(フレーム番号 ÷ フレームレート) 秒 に変換して指定できます。例: 30fpsの600フレーム目 → -ss 20。
Q3. ストリームコピーで品質は劣化しますか?
A. しません。-c copy は映像・音声データを変換しないため、品質は元素材と同じです。1秒あたりのデータ量は元のままなので、ファイルサイズは切り出した区間の長さに応じて小さくなります。
Q4. H.265(HEVC)動画をトリミングする場合も同じコマンドですか?
A. ほぼ同じです。ストリームコピーなら -c copy でそのままH.265のまま出力されます。再エンコードする場合は -c:v libx265 -crf 28 に変えてください。
Q5. Windows のコマンドプロンプトで動きますか?
A. はい。バックスラッシュ(\)による改行は Windows では使えないので、1行に書いてください。パスには二重引用符を使うと安全です。
ffmpeg -ss 00:01:00 -i "C:\input\video.mp4" -t 60 -c copy "C:\output\clip.mp4"