長尺の録画は、分割したほうが扱いやすいことがよくあります。アップロードのサイズ上限内に収める、章ごとに共有する、チャンクを並列処理する、といった用途です。FFmpegなら1つの動画を再エンコードなしで複数パートに分割でき、画質は元と同一で処理は数秒で完了します。本記事では一定時間ごとの自動分割、特定の1パートだけの切り出し、そして思わぬ結果を避けるためのキーフレームの仕組みを解説します。所要時間:8分。

動作確認: FFmpeg 8.1


この記事でわかること

  1. segment マクサーで一定長のパートに分割する方法
  2. -reset_timestamps 1 が重要な理由
  3. 開始時刻と長さで1パートだけ切り出す方法
  4. キーフレーム精度と、カット位置が決まる理由
  5. フレーム精度が必要なときの正確な分割(再エンコード)
  6. トラブルシューティングとFAQ

1. 一定長のパートに分割する(segment マクサー)

動画を連続した60秒のパートに切り分けるには、segment マクサーを使います。

ffmpeg -i input.mp4 -c copy -f segment -segment_time 60 -reset_timestamps 1 output_%03d.mp4

これで output_000.mp4output_001.mp4output_002.mp4… と、それぞれ約60秒のファイルが書き出されます。

  • -c copy … 再エンコードなし、無劣化かつ高速
  • -f segment … segment マクサーを使用
  • -segment_time 60 … 1パートあたりの目標長(秒)
  • -reset_timestamps 1 … 各パートのタイムスタンプを0から振り直す
  • output_%03d.mp4%03d がゼロ埋めの連番(000, 001, …)になる
オプション意味
-f segmentsegment マクサーを有効化
-segment_time1パートの目標秒数
-reset_timestamps 1各パートのクロックを0から開始
%03d自動連番(3桁)のファイルインデックス

このコマンドを実行可能ブロックではなくプレーンテキストで示しているのは %03d パターンのためです。連番は実行時にFFmpegが埋めます。


2. -reset_timestamps 1 が重要な理由

-reset_timestamps 1 を付けないと、各パートは元ファイルの元のタイムスタンプをそのまま保持します。すると output_001.mp4 は0秒ではなく60秒から始まり、多くのプレーヤーで再生開始前に長い空白が表示されます。

-reset_timestamps 1 を付ければ、すべてのパートが 00:00:00 から始まり、各ファイル単体できれいに再生できます。特別な理由がない限りオンにしておきましょう。


3. 開始時刻と長さで1パートだけ切り出す

スライスが1つだけ必要な場合(例:最初の60秒)、segment マクサーは不要です。開始位置にシークして長さを指定します。

ffmpeg -ss 00:00:00 -t 60 -i input.mp4 -c copy output_part1.mp4
  • -ss 00:00:00 … 開始位置(ここでは先頭)
  • -t 60 … その位置から60秒分
  • -c copy … 無劣化コピー

後ろのスライスが欲しい場合は開始時刻を変えます。例えば2:00から3:00のチャンク:

ffmpeg -ss 00:02:00 -t 60 -i input.mp4 -c copy output_part2.mp4

開始・終了でのカットや -to フラグの詳細はトリミング完全ガイドを参照してください。


4. キーフレーム精度 — カット位置が決まる理由

-c copy で分割する場合、FFmpegはキーフレーム(Iフレームとも呼ぶ)でしかカットできません。再エンコードせずにGOPの途中で分割することはできません。特にsegment muxerは、指定した各時刻と同じか、それ以降のキーフレームで分割するため、パートの開始が指定時刻より少し遅くなることがあります。

方法カット精度速度画質
-c copy(ストリームコピー)キーフレームに吸着非常に高速無劣化
再エンコードフレーム単位遅い再エンコードされる

つまり60秒のセグメントが、キーフレームの位置によって実際には58秒や62秒になることがあります。多くの用途ではこれで問題ありません。正確なフレームでカットしたいときは再エンコードします(次章)。仕組みはFFmpegの Seeking wiki を参照してください。


5. 正確な時刻で分割する(再エンコード)

フレーム精度が速度より重要なときは、-c copy を外してFFmpegに再エンコードさせます。分割点を任意のフレームにできます。

ffmpeg -ss 00:00:30 -t 30 -i input.mp4 -c:v libx264 -crf 18 -c:a aac output_exact.mp4
  • -c copy がないため、FFmpegはデコードして再エンコードし、00:00:30 から正確に開始できる
  • -crf 18 … 高画質(値が小さいほど高画質・ファイルは大きい)

代償として時間と再エンコードの工程がかかりますが、カットはフレーム単位で正確です。


6. トラブルシューティング

症状1: パートの冒頭に黒画面やフリーズが数フレーム入る

原因: ストリームコピーがキーフレームより前から始まり、デコーダに表示できる完全なフレームがまだ無かった。 解決策: キーフレームへの吸着を受け入れるか、再エンコードで正確に開始します(第5章)。

症状2: 各パートの開始時刻がおかしい

原因: -reset_timestamps 1 を省略したため、元のタイムスタンプを保持している。 解決策: segment コマンドに -reset_timestamps 1 を追加します(第1章)。

症状3: 出力ファイルが1つしか生成されない

原因: 出力ファイル名に %03d パターンが無く、すべてのセグメントが同じファイルを上書きした。 解決策: 出力名に %03d(または同様の連番)を含め、各パートに一意のインデックスを付けます。


よくある質問

Q1. 分割すると画質は落ちますか? A. -c copy なら落ちません。ビットストリームをそのままコピーします。画質が変わるのは第5章の再エンコード方式だけです。

Q2. 時間ではなくファイルサイズで分割できますか? A. segment マクサーは -segment_time(時間)と関連オプションに対応します。時間ベースの分割が最も確実です。サイズ上限がある場合は、上限内に収まる時間で分割してください。

Q3. 60秒のセグメントが実際には62秒になるのはなぜ? A. -c copy ではFFmpegが最も近いキーフレームに吸着するため、セグメント長は多少前後します。正確な長さが必要なら再エンコード(第5章)してください。

Q4. 分割したパートを後で結合できますか? A. できます。分割と結合は逆の操作です。再結合は動画結合完全ガイドを参照してください。

Q5. MKVやMOVでも動作しますか? A. します。segment マクサーはコンテナをまたいで動作します。出力に合った拡張子を付けるだけです(例:output_%03d.mkv)。


関連記事


Tested with FFmpeg 8.1 — verified with our command-check script 一次ソース: ffmpeg.org/ffmpeg-formats.html#segment / trac.ffmpeg.org/wiki/Seeking