「このシーンだけ切り出したい」「最初の30秒を削除したい」——動画編集の中で最も頻繁に必要になるのがトリミングです。FFmpegなら -ss-to-t の3つのオプションを組み合わせるだけで、ミリ秒単位の精確なカットが可能です。この記事を読めば、速度優先・精度優先どちらのケースにも対応できるようになります。所要時間:10分。

動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)
対象 OS: Windows / macOS / Linux


この記事でわかること

  1. -ss-to-t の意味と使い分け
  2. 入力前 -ss vs 出力前 -ss — 速度と精度のトレードオフ
  3. ストリームコピー(-c copy)による瞬時カットとキーフレーム問題の解消法
  4. 再エンコードによるフレーム単位の精確なトリミング
  5. 複数区間の一括切り出し(分割抽出)
  6. キーフレーム位置を確認してから切り出す手順
  7. バッチトリミング(シェルスクリプト)
  8. よくあるエラーと解決策5件
  9. 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:SS00:01:301分30秒
HH:MM:SS.mmm00:01:30.5001分30秒500ミリ秒
秒数(小数可)90 または 90.590秒(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"

関連記事


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/Seeking / ffmpeg.org/ffmpeg-formats.html