長い録画は、分割すると扱いやすくなります。アップロードのサイズ上限に収めたいときや、章ごとに共有したいときに便利です。FFmpegなら、再エンコードせずに1つの動画を複数のパートに分割できます。画質は元のままで、処理は数秒で終わります。

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

動画を60秒ずつのパートに分けるには、segment マクサー(出力を一定の長さごとに別のファイルへ書き分ける機能)を使います。

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

output_000.mp4、output_001.mp4、output_002.mp4… と、約60秒ずつのファイルができます。-c copy は再エンコードしない指定で、画質を落とさず速く処理できます。ほかのオプションの意味は次のとおりです。

オプション 意味
-f segment segment マクサーを使う
-segment_time 1パートの目標の長さ(秒)
-reset_timestamps 1 各パートの時刻を0から始める
%03d 3桁の自動連番(000, 001, …)

2. -reset_timestamps 1 が重要な理由

-reset_timestamps 1 を付けないと、各パートに元の動画の時刻(タイムスタンプ)がそのまま残ります。たとえば output_001.mp4 は0秒ではなく60秒から始まり、プレーヤーによっては再生前に長い空白が出ます。

付ければ、どのパートも 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フレームとも呼ぶ。それだけで1枚の画像に戻せるフレーム)の位置でしか切れません。キーフレームとキーフレームの間で切るには、再エンコードが必要です。segment マクサーは、指定した時刻ちょうどか、それ以降のキーフレームで切ります。そのため、パートの開始が指定時刻より少し遅れることがあります。

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

たとえば60秒のつもりのパートが、キーフレームの位置しだいで58秒や62秒になることがあります。たいていの用途は、これで困りません。フレーム単位で正確に切りたいときは、再エンコードします(次章)。仕組みはFFmpegの Seeking wiki にあります。

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

速さより正確さが大事なときは、-c copy を外して再エンコードします。どのフレームでも分割できます。

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: パートの冒頭に黒画面やフリーズが数フレーム入る

原因: -c copy では、映像はキーフレームからしか始まりません。-ss を -i の後ろに書いてキーフレームでない位置で切ると、次のキーフレームまで映像がなく、音声だけが先に流れます(segment マクサーのパートは、必ずキーフレームから始まります)。 解決策: -ss は第3章のように -i の前に書きます。正確な位置から始めたいときは、再エンコードします(第5章)。

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

原因: -reset_timestamps 1 がないため、元の時刻が残っています。 解決策: segment のコマンドに -reset_timestamps 1 を足します(第1章)。

症状3: Invalid segment filename template と出て、何も書き出されない

原因: 出力ファイル名に %03d などの連番がありません。segment マクサーは、連番のない名前では1つもファイルを作らずに止まります。 解決策: 出力名に %03d などの連番を入れて、パートごとに別の名前にします。

よくある質問

Q1. 分割すると画質は落ちますか? A. -c copy なら落ちません。映像と音声のデータをそのままコピーするからです。画質が変わるのは、第5章の再エンコードの場合だけです。

Q2. 時間ではなくファイルサイズで分割できますか? A. segment マクサーで指定できるのは、-segment_time(時間)と関連するオプションです。時間で分けるのが確実です。サイズに上限があるなら、上限に収まる長さを指定してください。

Q3. 60秒のはずのパートが62秒になるのはなぜですか? A. -c copy では、segment マクサーが指定した時刻ちょうどか、それより後の最初のキーフレームで切るため、長さが多少前後します。正確な長さが必要なら、再エンコード(第5章)してください。

Q4. 分割したパートを後で結合できますか? A. できます。方法は動画の結合を参照してください。

Q5. MKVやMOVでも使えますか? A. 使えます。segment マクサーは、コンテナの種類を問いません。出力名の拡張子を変えるだけです(例:output_%03d.mkv)。

関連記事