この記事でわかること
-ss(開始位置)、-to(終了位置)、-t(継続時間)の意味と使い分け-ssを入力の前に置く場合と後に置く場合の挙動の違い(速度 vs 精度)- ストリームコピー(
-c copy)による高速トリミングとその精度問題 - 再エンコードによるフレーム単位の精確なトリミング
- 時刻フォーマット(
HH:MM:SS.msと秒数)の使い方
テスト済みバージョン: FFmpeg 6.1で確認済み(ubuntu-latest / CI検証済み) 対象 OS: Windows / macOS / Linux
基本オプションの説明
| オプション | 位置 | 説明 |
|---|---|---|
-ss 位置 | 入力前または出力前 | 処理の開始位置を指定 |
-to 位置 | 出力前 | 処理の終了位置を指定(ファイル先頭からの絶対時刻) |
-t 時間 | 入力前または出力前 | 処理する継続時間を指定 |
-toと-tは同時に使用できません。両方指定した場合は-tが優先されます(FFmpeg公式ドキュメントより)。
時刻フォーマット
FFmpegの時刻指定には2種類の書き方が使えます。
| 形式 | 例 | 説明 |
|---|---|---|
HH:MM:SS | 00:01:30 | 1分30秒 |
HH:MM:SS.ms | 00:01:30.500 | 1分30秒500ミリ秒 |
| 秒数(小数可) | 90 または 90.5 | 90秒(90.5秒) |
入力前 -ss vs 出力前 -ss(最重要)
-ss の位置がトリミングの速度と精度を決める最大のポイントです。
入力前 -ss(高速シーク / キーフレームベース)
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4
-ss を -i の前に置くと、FFmpegは指定時刻の直前のキーフレームに高速ジャンプ(fast seek)します。
- メリット: 大容量ファイルでも数秒で処理完了
- デメリット: キーフレーム境界に丸められるため、指定時刻より少し前から切り出される場合がある
出力前 -ss(低速シーク / フレーム正確)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
-ss を -i の後に置くと、FFmpegはファイルの先頭からデコードしながら指定フレームまで進みます。
- メリット: 指定した時刻の正確なフレームから切り出せる
- デメリット: ファイルの先頭からデコードするため、長い動画の後半を切り出すときは非常に遅い
どちらを使うべきか
| ユースケース | 推奨 |
|---|---|
| ストリームコピー(-c copy)で素早く切り出す | 入力前 -ss(速度優先) |
| フレーム単位の精確なカットが必要 | 入力前 -ss + 再エンコード(後述) |
| 確認用に短いクリップを素早く抜き出す | 入力前 -ss |
ストリームコピーによる高速トリミング(-c copy)
再エンコードなしで切り出すため非常に高速です。ただし精度はキーフレーム境界に依存します。
ffmpeg -ss 00:00:30 -i input.mp4 -to 00:01:30 -c copy output.mp4
ffmpeg -ss 90 -i input.mp4 -t 60 -c copy output.mp4
注意点:
- 開始点が正確なキーフレームと一致しない場合、出力の冒頭に映像の乱れ(ブロックノイズ)が生じることがあります
-c copyは再エンコードしないため、ファイルサイズは元素材に依存します
精確なトリミング(再エンコードあり)
フレーム単位の正確な切り出しが必要な場合は、入力前 -ss と再エンコードを組み合わせます。入力前 -ss で高速シーク後、そこから再エンコードするため速度と精度のバランスが取れます。
ffmpeg -ss 00:00:30 -i input.mp4 -to 00:01:30 -c:v libx264 -crf 23 -c:a aac output.mp4
継続時間で指定する場合。
ffmpeg -ss 00:01:00 -i input.mp4 -t 30 -c:v libx264 -crf 23 -c:a aac output.mp4
-to と -t の使い分け
-to:終了タイムスタンプで指定
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:03:00 -c copy output.mp4
この例では1分00秒〜3分00秒の2分間を切り出します。-to はファイル先頭からの絶対タイムスタンプです。
-t:継続時間で指定
ffmpeg -ss 00:01:00 -i input.mp4 -t 120 -c copy output.mp4
この例では1分00秒から120秒間(2分間)を切り出します。終了時刻を計算しなくてよいので便利です。
よくある落とし穴
-c copy で出力冒頭がおかしい
原因: 切り出し開始点がキーフレームでないため、デコーダーがフレームを正しく再構成できない。
対処: -c:v libx264 -c:a aac で再エンコードするか、開始点をキーフレーム位置に調整してください。
-to の時刻が入力前 -ss の影響を受ける
FFmpegのバージョンや状況によって挙動が変わる場合があります。期待通りにならない場合は -to の代わりに -t(継続時間)を使うと明確です。
無音・映像のみになる
音声ストリームが存在するか確認してください。-an(音声なし)や -vn(映像なし)が意図せず指定されていないかも確認します。
関連記事
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner) 一次ソース: ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/Seeking / ffmpeg.org/ffmpeg-formats.html