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"

関連記事