「60fps 動画を Web 向けに 30fps にしたい」「映画らしい 24fps に変換したい」「タイムラプスを作りたい」——FFmpeg のフレームレート変換は fps フィルタ 1 行で完結します。-r オプションとの違いを理解すれば、可変フレームレート素材でも安定した変換ができます。所要時間:10分。
動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)
この記事でわかること
- ffprobe でフレームレートを確認する方法
-rオプションとfpsフィルタの違いと使い分け- フレームレートを下げる(60→30fps など)
- フレームレートを上げる(24→60fps)
- 代表的なユースケース別変換コマンド
- タイムラプス作成への応用
- よくあるエラーと解決策5件
- 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 | 映画標準。映画的な雰囲気 |
| 25 | PAL規格(欧州・中東・アジア一部) |
| 29.97 / 30 | NTSC規格(日本・北米)、Web動画 |
| 50 | PAL規格の高フレームレート |
| 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
関連記事
- 動画をリサイズ・スケールする — scale フィルタの使い方
- スライドショー・タイムラプス動画を作成する
- 動画圧縮の完全ガイド — CRF・ビットレート・プリセット
- FFmpegコマンドの基本構文 — 入力・フィルタ・出力の順序
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / ffmpeg.org/ffmpeg-codecs.html