「このシーンだけ切り出したい」「最初の30秒を削除したい」——動画編集の中で最も頻繁に必要になるのがトリミングです。FFmpegなら -ss・-to・-t の3つのオプションを組み合わせるだけで、ミリ秒単位の精確なカットが可能です。この記事を読めば、速度優先・精度優先どちらのケースにも対応できるようになります。所要時間:10分。
動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)
対象 OS: Windows / macOS / Linux
この記事でわかること
-ss・-to・-tの意味と使い分け- 入力前
-ssvs 出力前-ss— 速度と精度のトレードオフ - ストリームコピー(
-c copy)による瞬時カットとキーフレーム問題の解消法 - 再エンコードによるフレーム単位の精確なトリミング
- 複数区間の一括切り出し(分割抽出)
- キーフレーム位置を確認してから切り出す手順
- バッチトリミング(シェルスクリプト)
- よくあるエラーと解決策5件
- FAQ5問
基本オプション早見表
| オプション | 配置位置 | 意味 | 例 |
|---|---|---|---|
-ss 開始位置 | -i の前または後 | 処理開始位置(絶対タイムスタンプ) | -ss 00:01:30 |
-to 終了位置 | 出力ファイルの前 | 処理終了位置(ファイル先頭からの絶対時刻) | -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秒) |
コマンド例
1. 基本:ストリームコピーで高速トリミング(速度優先)
再エンコードなしで切り出すため、数秒で処理が完了します。開始点はキーフレームに丸められます(後述)。
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:03:00 -c copy output.mp4
-ss 00:01:00… 1分00秒から開始(入力前で高速シーク)-to 00:03:00… 3分00秒で終了(合計2分間を切り出し)-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 -i input.mp4 -to 00:01:30 -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(低速シーク)になるため、長い動画の後半クリップでは時間がかかります。
4. キーフレーム位置を確認してから切り出す(最高精度)
まず ffprobe でキーフレームのタイムスタンプを確認し、その位置に合わせて -ss を指定することでストリームコピーでも乱れのないカットが可能です。
# キーフレームのタイムスタンプを一覧表示
ffprobe -v quiet -select_streams v -skip_frame noref \
-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
...
キーフレームの位置(例: 00:01:04)を -ss に指定すれば、-c copy でも乱れがでません。
ffmpeg -ss 00:01:04 -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 -i input.mp4 -to 00:02:00 -c copy output.mp4
# ↑ -i の前
| 特性 | 詳細 |
|---|---|
| 仕組み | 指定時刻直前のキーフレームへ高速ジャンプ(fast seek) |
| 速度 | 非常に速い — 大容量ファイルでも数秒 |
| 精度 | キーフレーム境界に丸まるため、指定より0〜数秒手前から開始 |
| 推奨用途 | ストリームコピー(-c copy)での高速カット、レビュー用クリップ作成 |
出力前 -ss(低速・精確)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
# ↑ -i の後
| 特性 | 詳細 |
|---|---|
| 仕組み | ファイル先頭からデコードして指定フレームまで進む |
| 速度 | 遅い — 後半シーンでは数分かかることも |
| 精度 | フレーム単位で正確 |
| 推奨用途 | 再エンコードと組み合わせた精確カット(ただし入力前 -ss + 再エンコードの方が実用的) |
ストリームコピー vs 再エンコード 比較表
| 方法 | コマンド例 | 速度 | 精度 | ファイルサイズ変化 |
|---|---|---|---|---|
| ストリームコピー(入力前 -ss) | -ss X -i in -to Y -c copy out | ★★★ | ★★☆ | ほぼ変わらない |
| 再エンコード(入力前 -ss) | -ss X -i in -to Y -c:v libx264 -crf 23 out | ★☆☆ | ★★★ | 変わる(設定次第) |
| 出力前 -ss + ストリームコピー | -i in -ss X -to Y -c copy out | ★☆☆ | ★★★ | ほぼ変わらない |
実務上の推奨: 入力前 -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
入力のタイムスタンプをそのまま出力に引き継ぐオプション。複数クリップを後で結合する場合に使います。
ffmpeg -ss 00:01:00 -i input.mp4 -t 30 -c copy -copyts clip.mp4
トラブルシューティング
エラー1: 出力の冒頭がブロックノイズだらけ
症状: -c copy で切り出した動画の最初の数秒間に緑や黒のブロックが出る。
原因: 切り出し開始点がキーフレームでないため、デコーダーが参照フレームなしにフレームを再構成しようとしている。
解決策:
# 解決策A: 再エンコードする
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c:v libx264 -crf 23 -c:a aac output.mp4
# 解決策B: キーフレーム位置を確認してからその位置を -ss に指定
エラー2: -to を指定したのに期待の長さにならない
症状: -ss 00:01:00 -to 00:02:00 で1分間のはずが長さがズレる。
原因: 入力前 -ss を使うと、-to の基準がキーフレーム後の実際の開始点になる場合がある(FFmpegのバージョンや実装依存)。
解決策: -to の代わりに -t(継続時間)を使うと明確。
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
症状: ファイルは生成されるが0バイト。
原因: -ss の値が動画の総尺を超えている。
解決策:
# まず総尺を確認
ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1 input.mp4
エラー5: -c copy で音声と映像がズレる
症状: 切り出した動画で口と音声が合っていない。
原因: 音声ストリームのキーフレーム位置が映像と異なる。
解決策:
# 映像のみコピー、音声は再エンコード
ffmpeg -ss 00:01:00 -i input.mp4 -t 60 -c:v copy -c:a aac output.mp4
FAQ
Q1. -ss と -to の両方を入力前に置けますか?
A. -to は出力オプションなので -i の後に書きます。入力前に置けるのは -ss と -t だけです。-to を入力前に書くと警告が出て正しく動作しない場合があります。
Q2. フレーム番号で指定することはできますか?
A. 直接フレーム番号は指定できませんが、(フレーム番号 ÷ フレームレート) 秒 に変換して指定できます。例: 30fpsの600フレーム目 → -ss 20。
Q3. ストリームコピーで品質は劣化しますか?
A. しません。-c copy は映像・音声データを一切変換しないため、元素材と品質は同一です。ファイルサイズもほぼ変わりません。
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"
関連記事
- 動画の結合 — concat demuxer と concat filter の使い分け
- FFmpegコマンドの基本構文 — 入力・フィルタ・出力の順序
- 動画圧縮 — CRFモードとビットレートモードの選択
- ffprobeでメタデータとストリーム情報を確認する
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/Seeking / ffmpeg.org/ffmpeg-formats.html