「60fps 動画を Web 向けに 30fps にしたい」「映画らしい 24fps に変換したい」「タイムラプスを作りたい」——FFmpeg のフレームレート変換は fps フィルタ 1 行で完結します。-r オプションとの違いを理解すれば、可変フレームレート素材でも安定した変換ができます。所要時間:10分。

動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)


この記事でわかること

  1. ffprobe でフレームレートを確認する方法
  2. -r オプションと fps フィルタの違いと使い分け
  3. フレームレートを下げる(60→30fps など)
  4. フレームレートを上げる(24→60fps)
  5. 代表的なユースケース別変換コマンド
  6. タイムラプス作成への応用
  7. よくあるエラーと解決策5件
  8. FAQ 5問

まず現在のフレームレートを確認する

変換前に元ファイルのフレームレートを確認しましょう。

ffprobe -v error -select_streams v:0 \
  -show_entries stream=r_frame_rate,avg_frame_rate \
  -of default=noprint_wrappers=1 input.mp4

出力例:

r_frame_rate=60000/1001
avg_frame_rate=60000/1001
フィールド意味
r_frame_rateコンテナのメタデータに記録されたフレームレート(名目値)
avg_frame_rate実際のフレーム数から算出した平均フレームレート

可変フレームレート(VFR)動画では両者が異なります。60000/1001 ≒ 59.94fps(NTSC規格)。


コマンド例

1. フレームレートを下げる(fps フィルタ — 推奨)

# 60fps → 30fps(Web配信・SNS向け)
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 23 -c:a copy output.mp4

# 29.97fps → 25fps(PAL規格・欧州向け)
ffmpeg -i input.mp4 -vf fps=25 -c:v libx264 -crf 23 -c:a copy output.mp4

# 30fps → 24fps(映画的な雰囲気)
ffmpeg -i input.mp4 -vf fps=24 -c:v libx264 -crf 23 -c:a copy output.mp4
  • fps=N — 目標フレームレートを指定。余分なフレームを削除してタイムスタンプ基準で間引く
  • -c:a copy — 音声はコーデックを変えずにコピー(高速・劣化なし)

2. -r オプションで指定する(シンプルな場合)

# 出力フレームレートを30fpsに指定
ffmpeg -i input.mp4 -r 30 -c:v libx264 -crf 23 -c:a copy output.mp4

-r はエンコード直前にフレームを複製・削除します。単純な変換には十分ですが、VFR 素材では fps フィルタのほうが安定します。

実測メモ(Ubuntu 22.04 + FFmpeg 6.1): スマートフォン録画の VFR 動画(59.94fps 可変)に -r 30 を適用したところ、一部シーンでフレームが2枚重複して映像がカクついた。同じ動画に -vf fps=30 を使った場合は、タイムスタンプ基準で正確に間引かれ、カクつきなし。VFR 素材には fps フィルタ一択。

3. フレームレートを上げる(フレーム複製)

# 24fps → 60fps(フレーム複製で滑らかに見せる)
ffmpeg -i input.mp4 -vf fps=60 -c:v libx264 -crf 23 -c:a copy output.mp4

フレームレートを上げる場合、fps フィルタは既存フレームを複製して目標レートを達成します。新たな中間フレームは生成しません。本格的な補間(モーション推定)には minterpolate フィルタが必要です。

4. タイムラプス:1fps で抽出

# 動画から1秒ごとに1フレームを抽出した超低フレームレート動画
ffmpeg -i input.mp4 -vf fps=1 -c:v libx264 -crf 23 output_timelapse.mp4

5. 連番画像からタイムラプス動画を作成

ffmpeg -framerate 1 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
  • -framerate 1 — 入力画像を 1fps で読み込む(1枚=1秒)
  • -r 30 — 出力を 30fps にする(1枚が 30 フレームに複製)
  • -pix_fmt yuv420p — 広い互換性のためのピクセルフォーマット

6. バッチ処理:フォルダ内全動画を 30fps に変換

for f in *.mp4; do
  ffmpeg -i "$f" -vf fps=30 -c:v libx264 -crf 23 -c:a copy "30fps_${f}" -y
done

-r オプション vs fps フィルタ 比較表

比較項目-r(出力オプション)-vf fps=N(フィルタ)
処理タイミングエンコード直前フィルタグラフ内(より早い段階)
タイムスタンプ参照限定的フレームのタイムスタンプを参照
VFR 素材での安定性不安定になる場合ありより安定した変換
他フィルタとの組み合わせ可能フィルタチェーンに統合可能
推奨用途シンプルな変換VFR素材・精確な制御

推奨: 迷ったら -vf fps=N を使う。VFR 素材(スマホ撮影・OBS 録画など)では特に有効。


代表的なフレームレート一覧

fps用途
24 / 23.976映画標準。映画的な雰囲気
25PAL規格(欧州・中東・アジア一部)
29.97 / 30NTSC規格(日本・北米)、Web動画
50PAL規格の高フレームレート
59.94 / 60ゲーム・スポーツ・高品質Web動画
120最新スマートフォン・ハイスピード撮影

オプション詳解

オプション意味推奨値
-vf fps=Nフィルタグラフでフレームレートを変換24 / 30 / 60
-r N出力フレームレート指定(エンコード直前)シンプルな変換時
-framerate N入力画像シーケンスの読み込み速度タイムラプス作成時
-pix_fmt yuv420pピクセルフォーマット指定互換性確保に必須
-c:a copy音声を無劣化コピーフレームレート変換では常に推奨

トラブルシューティング

エラー1: 変換後の動画が音声とズレる

症状: 映像と音声のタイミングがズレる
原因: VFR 素材を -r で変換すると、フレームの削除・複製が音声タイムスタンプとズレを生じさせることがある
解決策:

# fps フィルタで変換(より安定)
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 23 -c:a copy output.mp4

エラー2: タイムラプス変換後に音声が長い

症状: 映像が短いのに音声が元の長さのまま残る
原因: fps=1 で映像は短くなるが音声はそのまま
解決策: タイムラプスでは音声を除去するのが正しい:

ffmpeg -i input.mp4 -vf fps=1 -an -c:v libx264 -crf 23 output.mp4

エラー3: No such encoder libx264

原因: FFmpeg が libx264 なしでビルドされている
解決策: フル機能版 FFmpeg をインストールする:

sudo apt install ffmpeg        # Ubuntu/Debian
brew install ffmpeg            # macOS

エラー4: 出力ファイルのフレームレートが変わっていない

原因: -r を入力側(-i の前)に付けてしまっている
解決策: -r または fps=N-i の後に指定する:

# 間違い(入力側に -r)
ffmpeg -r 30 -i input.mp4 output.mp4

# 正しい(出力側に指定)
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 23 output.mp4

エラー5: pts has no value や画像シーケンスの読み込み失敗

原因: 連番画像の -framerate を指定し忘れた、またはファイル名のパターンが合っていない
解決策:

# ファイル名パターンを確認してから実行
ls img*.png | head -3
# 出力例: img001.png img002.png img003.png → %03d を使う
ffmpeg -framerate 24 -i img%03d.png -c:v libx264 -pix_fmt yuv420p output.mp4

FAQ

Q1. -r-vf fps=N はどちらを使えばいいですか?
A. 迷ったら -vf fps=N を使ってください。タイムスタンプを参照しながら変換するため、特にスマホやOBSなどの VFR 素材で安定した結果が得られます。-r はシンプルな固定フレームレート素材に有効です。

Q2. フレームレートを上げると動きが滑らかになりますか?
A. fps フィルタは既存フレームを複製するだけなので、動きの滑らかさは元素材と同じです。本当に滑らかにするには minterpolate フィルタ(モーション推定)が必要ですが、処理に時間がかかります。

Q3. 変換後のフレームレートを確認するには?

ffprobe -v error -select_streams v:0 \
  -show_entries stream=avg_frame_rate \
  -of default=noprint_wrappers=1 output.mp4

Q4. タイムラプス作成時に音声も残したい場合は?
A. 映像の時間軸が変わるため、そのまま残すと音声と映像がズレます。音楽などを別途追加するか、-an で音声なしにするのが現実的です。

Q5. 29.97fps(30000/1001)のような分数指定はできますか?
A. できます:

# 29.97fps(NTSC)で出力
ffmpeg -i input.mp4 -vf fps=30000/1001 -c:v libx264 -crf 23 output.mp4

関連記事


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