可変フレームレート(VFR)は、映像フレームを表示する間隔が一定ではない動画です。録画設定や負荷、収録方式などで生じ、「画面が変わったときだけ記録する」という意味ではありません。正しいタイムスタンプを扱えるソフトなら、VFRでも映像と音声を同期できます。編集ソフトがCFRを要求する場合や、比較試験で相性の問題を確認した場合に変換を検討します。

まず元動画と出力を同じプレイヤーで、冒頭・中間・末尾の3か所で比較してください。元から一定量ずれているならfps変更だけでは狙った修正になりません。編集ソフトだけでずれる場合は、短いCFRコピーで比較してから全体を処理します。進行する音ズレ と 変換後の音ズレ も参照してください。

VFR と CFR

種類 フレームのタイミング 典型的なソース 編集ソフト/プレイヤーとの相性
VFR(可変) フレームごとに間隔が変わる 一部の画面/スマホ/ゲーム録画 タイムスタンプを正しく扱う必要がある
CFR(固定) 一定間隔(例: 1/30秒ごと) 多くの編集・納品形式 fpsだけでコーデックの互換性は決まらない

どちらの形式でも同期は可能です。VFRの表示時刻を無視するソフト、壊れたタイムスタンプ、収録データの欠落、既存の音声オフセットなどを切り分けます。CFR化はフレームを複製・間引きする処理で、失われた映像や本来の口の動きとの同期を復元するものではありません。

手順①: ffprobe でVFRを検出する

VFRを疑う手早い方法は、報告される2つのレート、r_frame_rate と avg_frame_rate(ファイル全体の平均)を比較することです。r_frame_rate は FFmpegが推測した基準レートで、ストリーム内のすべてのタイムスタンプを表現できる最小のレート(最小公倍数に近い値)です。「実際の」あるいは意図されたフレームレートではありません。そのため r_frame_rate と avg_frame_rate の食い違いは、VFRかもしれないという手がかり(ヒューリスティック)であって、それだけでは証拠になりません。真のCFRファイルでは、両者は通常等しいかほぼ等しくなります。

ファイルをざっと調べます。

ffprobe -hide_banner input.mp4

概要だけでは確定できません。レートとタイムベースのフィールドを明示して読み取るには次を使います。

ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,avg_frame_rate,time_base -of json input.mp4
# 例示的な比較(コマンドではありません)
r_frame_rate   = 60/1     <- FFmpegの基準レート推測値(最小公倍数に近い)
avg_frame_rate = 47/1     <- 実際の平均。異なる => VFRを疑う

平均値が同じでもCFRの証明にはなりません。全体のデコード後の表示時刻を確認してください。Bフレームを含む動画ではパケットの並び順と表示順が異なります。粗いタイムベースに分数fpsを記録した結果、小さく交互に丸められる差もVFRと即断しないでください。時刻の欠落・破損は別の問題です。

ffprobe -v error -select_streams v:0 -show_frames -show_entries frame=best_effort_timestamp_time -of json input.mp4

各フレームのbest_effort_timestamp_timeを読みます。付加情報のフィールドが一緒に出ても、それはフレームの時刻ではありません。長い動画では出力量が多くなります。隣り合う表示時刻の差を、タイムベースの丸め誤差も考慮して比較します。平均fpsだけから録画時に意図したfpsは決められません。

手順②: 30 fps のCFRに変換する

変換するには、-fps_mode cfrで固定フレームレートに強制し、-rで目標レートを選びます。機器の種類から推測せず、録画設定と編集・納品先の指定を確認します。ここでは音声をコピーするので、再エンコードされるのは映像だけです。

ffmpeg -i input.mp4 -fps_mode cfr -r 30 -c:v libx264 -c:a copy output.mp4
  • -fps_mode cfr — 出力を固定フレームレートに強制
  • -r 30 — 目標を毎秒30フレームに
  • -c:v libx264 — 映像を安定したタイムライン上に再エンコード(フレームタイミング変更に必須)
  • -c:a copy — 音声をそのままコピー(無劣化)

この例では映像を再エンコードして必要なフレームを複製・間引きします。音声コピーは選ばれた音声の符号化データを維持しますが、元からある音ズレを直したり、MP4との互換性を保証したりはしません。自動ストリーム選択なので、すべての音声・字幕・添付を保存するコマンドでもありません。元動画を残し、別の出力名を使います。

手順③: 60 fps または分数fpsを選ぶ

60fps付近で録画された素材を60fpsで納品したい場合の例です。CRF 18とAAC音声を使います。fpsを上げるだけで画質が良くなるという意味ではありません。

ffmpeg -i input.mp4 -fps_mode cfr -r 60 -c:v libx264 -crf 18 -c:a aac output.mp4
  • -r 60 — 目標を毎秒60フレームに
  • -crf 18 — 既定より高品質(CRFが低いほど高品質・大きいファイル)
  • -c:a aac — MP4との幅広い互換性のため音声をAACに再エンコード

目標レートは意図して選んでください。30 fpsのソースを60 fpsにエンコードしてもフレームが複製されるだけで実際の滑らかさは増しません。レートを上げる特別な理由がない限り、-r はソースが実際に出すものに合わせてください。

29.97fpsまたは59.94fpsの編集・納品では、それぞれ30000/1001または60000/1001を使います。30や60とは同じ値ではありません。変換後は再生時間、フレーム間隔、動き、音ズレを実際の編集ソフトで確認してください。レート表示が一定になっただけでは修復成功と判断できません。

小さな動画をインストールなしで試すなら、ブラウザのVFR→CFR変換も使えます。独自の設定とブラウザのメモリ制約があり、上記コマンドの全オプションを再現するものではありません。

時刻の実行確認とオプションの互換性

合成素材でのフレーム間隔の確認

2026-09-12、WindowsのネイティブFFmpeg 8.1で、3秒・映像50フレーム・確認用の音を持つVFR素材を生成し、上記の各条件を1回ずつ実行しました。

出力 映像フレーム数 コンテナの再生時間 デコード後のフレーム間隔
CFR 30 90 3.000秒 約0.033333秒
CFR 60 / AAC 180 3.008秒 約0.016667秒

入力の生成条件・コマンド・出力ハッシュを公開しています。小さな間隔差にはタイムスタンプの丸めが含まれます。再生時間はコンテナの値で、映像と音声の終端が完全一致した証明ではありません。フレーム配置の試験であり、実録画の口の動きとの同期、ブラウザの速度、画質の実測ではありません。

オプションの互換性

FFmpeg 8.x では正しいオプションは -fps_mode cfr です。古いチュートリアルでは -vsync cfr(または -vsync 1)を使っているのを今でも見かけます。その記法は今のところ まだ動作します が、-vsync は 非推奨 であり、将来のリリースで削除される可能性があります。新しいコマンドでは -fps_mode を優先してください。両者の内部挙動は同じで、cfr は必要に応じてフレームを複製・削除して固定フレームレートに強制します。

オプション FFmpeg 8.x での状態 使うべきか
-fps_mode cfr 現行、推奨 はい
-vsync cfr / -vsync 1 非推奨、まだ動作 いいえ(旧来のみ)

まとめ表

目的 コマンド
フレーム時刻の確認 手順①のレート・時刻を指定したJSON出力を使用。短いストリーム概要だけでは確定しない
CFR 30に変換、音声維持 ffmpeg -i input.mp4 -fps_mode cfr -r 30 -c:v libx264 -c:a copy output.mp4
CFR 60に変換、CRF 18 / AAC ffmpeg -i input.mp4 -fps_mode cfr -r 60 -c:v libx264 -crf 18 -c:a aac output.mp4

VFR→CFRという枠組みではなく、単にfpsを変えたい場合は フレームレートを変更する を参照してください。

よくある質問

自分のファイルがVFRだと確実に判断するには?

報告される2つのレートは手がかりです。上記のデコード後の表示時刻を使い、タイムベースの丸めと意味のある間隔変化を区別し、冒頭だけでなく全体を確認します。撮影機器の種類だけではVFRかどうかは決まりません。

VFRなら必ず音ズレしますか?

いいえ。表示時刻に沿って再生すれば、可変間隔の映像と音声は同期できます。対応の悪い編集環境にはCFR化が役立つ場合がありますが、音ズレ全般の修復ではありません。進行する音ズレと区別して確認してください。

VFRをCFRに変換するには映像の再エンコードが必要ですか?

はい。固定フレームレートに強制するには、一定の間隔に合わせてフレームを複製・削除する必要があり、映像の再エンコードを伴います。ただし音声は -c:a copy でコピーできることが多いです。

目標フレームレートは何にすべきですか?

録画設定と編集・納品先の仕様を確認し、分数fpsかどうかも区別します。機器の種類や平均fpsだけでは意図したレートは決まりません。30fpsのソースを60fpsにエンコードしてもフレームが複製されるだけで、実際の滑らかさは増しません。

-vsync と -fps_mode のどちらを使うべきですか?

-fps_mode cfr です。FFmpeg 8.x では -vsync は非推奨で、まだ動作しますが旧来の記法です。新しいコマンドでは -fps_mode を使ってください。

関連記事