FFmpeg Cookbook
EN

VFR→CFR 変換ツール

画面録画やスマホの動画の「可変フレームレート(VFR)」を、一定のフレームレート(CFR)に変換します。まずファイルの情報からフレームレートを読み取り、必要なら先頭 30 秒のフレーム間隔も調べられます。

動画はサーバーに送られません
動画をドラッグ&ドロップ、またはタップして選択
MP4 / MOV / WebM / MKV など、最大 500MB・15 分まで
—
—
ヘッダを読み取り中…
映像は fps フィルタでフレームを複製・間引きして H.264、音声は AAC 160kbps へ再エンコードします。元からある音ズレや欠落フレームを修復する機能ではありません。自動のfpsは候補値です。録画・編集・納品の設定に合わせて選び、変換後の冒頭・中間・末尾を確認してください。
処理中… 0%
プレビューを再生できません。保存した動画を別の対応プレーヤーでも確認してください。出力の正常性はこの表示だけでは判断できません。
CFR 動画をダウンロード

対応する FFmpeg コマンド

現在の設定に対応するコマンドラインです。設定を変えるとリアルタイムで更新されます。

ffmpeg -y -i input-1.mp4 -map 0:v:0 -map "0:a:0?" -vf "fps=30,scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -preset veryfast -crf 22 -pix_fmt yuv420p -c:a aac -b:a 160k -movflags +faststart output-2.mp4

次にやること

よく使われる用途
画面録画・スマホ動画のフレーム間隔を確認Premiere / DaVinci に読み込む前の CFR 化OBS / ゲーム録画のフレーム間隔を揃える

使い方

  1. 動画をドロップMP4・MOV・WebM・MKV など、500MB・15 分までの動画を選びます。読み取った平均 fps と基準レート(tbr)が表示されますが、この 2 つだけでは、フレーム間隔が一定かどうかは分かりません。
  2. 必要ならフレーム間隔を確認「先頭30秒のフレーム間隔を調べる」を押すと、先頭最大 30 秒をデコードして、間隔がそろっていないフレームの割合を数えます。それより後ろの部分や、音ズレの原因までは分かりません。
  3. 出力レートを選ぶ録画の設定や、編集ソフトのプロジェクト設定に合わせて選びます。「自動」は、ファイルの情報から選んだ候補です。
  4. 変換してダウンロード映像は H.264、音声は AAC 160 kbps に再エンコードします。完了すると出力の fps / tbr が表示され、ファイル名には「_cfr30」のようにレートが付きます。

おすすめ設定

画面録画を一定間隔の映像に変換
録画設定と編集先に合うレート / CRF 22
「自動」は候補です。元の動画と変換後を同じプレーヤーで再生し、冒頭・中間・末尾で音が合っているか確かめます。
動画編集ソフトに読み込む素材の下処理
プロジェクトと同じレート / CRF 18
編集ソフトが CFR を必要とするときに使います。VFR の扱いはソフトによって違います。
高フレームレートのゲーム録画を60fpsで編集
60 / CRF 22
元の時刻に合わせてフレームを間引き・複製します。モニターのリフレッシュレートからは、録画の実際のフレームレートは分かりません。
放送・DVD 由来で 29.97 と表示される素材
29.97 / CRF 18
元の規格と編集ソフトの設定を確かめて選びます。fps フィルタはフレームを増減するだけで、再生速度は変えません。

うまくいかないとき

「VFR の疑い」と出るが、デコードすると「解析範囲はほぼ一定」

原因:ヘッダの値は推定値で、フレーム間隔の検査は先頭 30 秒だけを見ています。調べている対象が違います。

対処:先頭の結果だけで、全体の状態や音ズレの原因は決められません。ズレが最初から最後まで同じ量なら、音ズレ補正ツールで音声をずらせます。

変換したら動画が速くなった / 短くなった(CLI で自作した場合)

原因:入力の前に -r を付けると、元の時刻を無視して、指定したレートで時刻を付け直します。

対処:元の時刻を保ったまま一定間隔にするには、入力の後ろに -vf fps=30 を付けます。出力の長さも確かめます。

出力が元より大きくなった

原因:容量は、フレームの数・CRF・映像の中身で決まります。元より高い画質の設定で再エンコードすると、大きくなることがあります。

対処:出力を見ながら CRF を上げるか、動画圧縮ツールで容量を指定して圧縮します。

先頭30秒はCFRなのに後半で音がズレる

原因:先頭だけの検査では、後ろの部分の時刻情報や録音の問題は分かりません。

対処:ズレる区間を比べ、元の動画でもズレているかを先に確かめます。VFR だけが原因とは限りません。

動画の長さが15分の上限を超えている

原因:このツールで扱えるのは 15 分までです。短い動画でも、端末のメモリが足りないと失敗することがあります。

対処:元の動画を残し、パソコン版の FFmpeg で下のコマンドを実行します。

よくある質問

VFR(可変フレームレート)とは何ですか?

フレームの表示間隔が一定でない動画です。時刻情報が正しく、プレーヤーが対応していれば、VFR のままでも問題なく再生できます。編集ソフトが CFR を必要とするときや、実際に不具合があるときに変換します。

この変換で音ズレは本当に直りますか?

直るとは限りません。fps フィルタは元の時刻に合わせて映像のフレームを複製・間引きしますが、音と映像の中身を合わせ直すわけではありません(音声は AAC に再エンコードします)。ズレが一定の量なのか、時間とともに大きくなるのかで、直し方が変わります。

再生速度や長さは変わりますか?

変わりません。fps フィルタは元の時刻を保ったまま、フレームの数だけを増減します。ただし最後のフレームの扱いで、映像と音声の終わりがわずかにずれることがあります。冒頭・中間・末尾を元の動画と比べてください。

「自動」はどのレートを選びますか?

基準レート(tbr)が標準的な値に近ければそれを、そうでなければ平均 fps に近い標準値を選びます。tbr は推定値なので、録画の設定や編集ソフトの設定が分かっているなら、そちらに合わせます。

再エンコードせずに直せませんか?

できません。CFR にするにはフレームを増やしたり減らしたりする必要があり、`-c:v copy` では元の時刻がそのまま残ります。音声は、パソコン版の FFmpeg なら `-c:a copy` でそのままコピーできます。本ツールは、WebM(Opus)や MKV(FLAC)からでも再生しやすい MP4 にするため、音声を AAC 160 kbps に変換します。

29.97 と 30 のどちらを選ぶべきですか?

元の規格と、編集ソフトの設定に合わせます。fps フィルタは元の時刻に合わせてフレームを増減するので、どちらを選んでも動画の長さは変わりません。29.97 fps は 30000/1001 として指定します。

iPhoneのHEVC動画は使えますか?

HEVC の動画も読み込んで H.264 に変換できますが、プロファイルや端末のメモリによっては失敗します。まず短いコピーで試し、HDR の色や向きも確かめてください。

フレーム間隔のばらつきはどう数えていますか?

先頭最大 30 秒の表示時刻(pts_time)から、隣り合うフレームの間隔を 0.1ms 単位で数えます。いちばん多い間隔から 5%(最低 1.5ms)を超えて離れた間隔を「不揃い」とし、その割合が 2% を超えると「解析範囲で間隔にばらつき」と表示します。時刻の丸めによる小さな揺れを許容するための目安で、全体の分類や、録画時の意図を示すものではありません。

くわしい説明(設定の意味・制限・FFmpeg のコマンド)

設定の意味

平均フレームレート
FFmpeg が表示するファイル情報の fps の値です。全フレームを数え直した値ではなく、丸められています。
基準フレームレート (tbr)
FFmpeg が推定した基準のレートです。フレーム間隔が一定であることや、撮影時の設定を示すものではありません。
出力フレームレート
fps フィルタに渡す値です。「自動」は、tbr が標準的な値(24・25・30・60 など)ならそれを、そうでなければ平均 fps に最も近い標準値を選びます。
画質(CRF)
H.264 の画質の指定です。18(高画質)・22(標準、初期値)・26(軽量)から選びます。数字が大きいほど、容量は小さく画質は低くなります。

使えるブラウザと制限

  • ファイルは 500MB・15 分まで。超える場合は、上のコマンドをパソコン版の FFmpeg で実行します
  • フレーム間隔を調べるのは先頭最大 30 秒だけです。後ろの部分の時刻や音ズレは、別に確かめる必要があります
  • 出力は常に MP4(H.264 + AAC)です。ProRes や無劣化の出力は、パソコン版の FFmpeg で行います
  • 字幕は残りません。音声トラックが複数あるときは、最初の 1 本だけが残ります

同じ処理を FFmpeg のコマンドで

本ツールと同じ設定(fps フィルタで 30 fps にそろえる)
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0? -vf fps=30 -c:v libx264 -preset veryfast -crf 22 -pix_fmt yuv420p -c:a aac -b:a 160k -movflags +faststart output.mp4
本ツールは同じ -vf に scale=trunc(iw/2)*2:trunc(ih/2)*2 も付けて、幅や高さが奇数の動画を偶数にそろえます(奇数のままだと 4:2:0 の H.264 では書き出せません)。
-fps_mode cfr で一定レートにする(音声はそのままコピー)
ffmpeg -i input.mp4 -fps_mode cfr -r 30 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy output.mp4
FFmpeg 5.1 以降で使えます。古い解説にある -vsync cfr と同じ意味で、-vsync は非推奨です。
29.97 fps(NTSC)に揃える
ffmpeg -i input.mp4 -vf fps=30000/1001 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy output.mp4
29.97 fps は 30000/1001 と分数で指定します。
VFR を疑う(平均と基準の比較)
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,avg_frame_rate -of default=nw=1 input.mp4
2 つの値が違えば VFR の疑いがあります。同じでも VFR のことはあります。
先頭30秒のフレーム時刻を調べる
ffprobe -v error -select_streams v:0 -read_intervals %+30 -show_entries frame=pts_time -of csv=p=0 input.mp4
隣り合う時刻の差を比べます。本ツールも同じ種類の情報(showinfo の出力)を使い、少しの誤差を許容して数えます。先頭 30 秒より後ろは調べません。

「平均 ≠ 基準」は手掛かりで、証拠ではない

ファイル情報の fps と tbr は手掛かりにすぎません。差があっても、それだけで VFR や時刻の異常とは決められません。同じ値でも、間隔が一定とは限りません。FFmpeg のストリームの定義でも、基準レート(r_frame_rate)は推測値とされています。

先頭 30 秒のフレーム時刻を調べると、その範囲の間隔のばらつきが分かります。結果はこのツールの許容誤差による判定で、動画全体が CFR であることの保証ではありません。

fps フィルタと入力側の -r を混同しない

fps フィルタは、元の時刻を基準にフレームを複製・間引きします。出力側の -fps_mode cfr と -r でも一定のレートにできますが、丸め方や最後のフレームの扱いまで同じ結果になるとは限りません。

入力の前に付けた -r は、元の時刻を無視して時刻を付け直します。元のフレーム間隔が不規則だと、動画の長さが変わることがあります。画像の連番を読み込むときのレート指定とは使い方が違います。FFmpeg 公式の -r と -fps_mode の説明

出力レートは録画設定と編集先から決める

平均が 12fps と分かっても、撮影時に 30fps を狙っていたかどうかは分かりません。動きの多い部分を確かめ、低すぎるレートで必要なフレームを間引かないようにします。高いレートにしてフレームを複製しても、動きがなめらかになるわけではありません。

「自動」は基準レート(tbr)を手掛かりにしますが、撮影時の設定を示すものではありません。編集ソフトの設定も確かめてください。29.97 は 30000/1001、59.94 は 60000/1001 で指定します。fps で一定間隔にそろえる処理と、再生を速める倍速の処理は別のものです。