ffmpeg にはフレームレートの設定方法がいくつかあるが、同じオプションでも指定場所では効果が違ったりするので一般的な用途のまとめ。オリジナルよりもフレームレートが少ないときは同じように間引かれるが、出力結果も一致するとは限らない。動画時間が変わる方法に入力オプションの -r があるが変わるのは映像の速度であり、音声の速度は変わらない。

実験用の動画を作る

  • 0番から249番までの250フレーム、25fps の基本動画(手軽)
    ffmpeg -f lavfi -i testsrc2=d=10 -vcodec utvideo input.mkv
  • 0番から249番までの250フレーム、25fps の基本動画
    ffmpeg -f lavfi -i testsrc=d=10,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n}':fontsize=30:x=W-tw:y=H-th" -vcodec utvideo input.mkv

コマンド例

  • フィルタとしての fps
    オリジナルよりフレームレートが少なければ間引く、多ければ重複フレームをつくる。動画時間は変わらない

    コマンド例
    ffmpeg -i input.mkv -vf fps=30 -vcodec utvideo output.mkv

    公式ドキュメント:FFmpeg Filters Documentation : fps

  • フィルタとしての framerate
    オリジナルよりフレームレートが少なければ間引く、多ければ前後フレームを平均して増やす。動画時間は変わらない。YUV限定でRGB出力不可。簡易的なフレーム補間をする framerate

    コマンド例
    ffmpeg -i input.mkv -vf framerate=30 -vcodec utvideo output.mkv

  • フィルタとしての minterpolate
    フレーム補間フィルタなのでオリジナルよりも多い値を指定する。補間方法は平均と予測がある。動画時間は変わらない。ffmpeg でフレーム補間する minterpolate

    コマンド例(予測なのでかなり遅い)
    ffmpeg -i input.mkv -vf minterpolate=50 -vcodec utvideo output.mkv

  • 入力オプションとしての -r
    入力ファイルの前に指定する。総フレーム数はそのままに1秒あたりのフレームレートを指定するので、オリジナルよりフレームレートが少なければ動画時間が長く、多ければ動画時間が短くなる

    コマンド例
    ffmpeg -r 30 -i input.mkv -vcodec utvideo output.mkv

    公式ドキュメント:ffmpeg Documentation : Video Options

  • 出力オプションとしての -r
    入力ファイルの後に指定する。オリジナルよりフレームレートが少なければ間引く、多ければオリジナルのまま。動画時間は変わらない

    コマンド例
    ffmpeg -i input.mkv -r 30 -vcodec utvideo output.mkv

    公式ドキュメント:ffmpeg Documentation : Video Options

  • dshow としての -framerate
    Windows の DirectShow 入力での入力フレームレート。SCFF などの仮想デバイスのように任意に指定できる場合と、キャプチャカードやウェブカメラのように任意に指定できない場合がある

    コマンド例
    ffmpeg -rtbufsize 100MB -f dshow -framerate 30 -i video=device_name -vcodec utvideo output.mkv

    公式ドキュメント:FFmpeg Devices Documentation : dshow

  • 連番画像を入力するときのフレームレートを決める -framerate
    連番画像を入力するときのフレームレートは -r ではなくて -framerate を使う方がより正確であり、公式ドキュメントを見ても設定項目に書いてある

    コマンド例
    ffmpeg -framerate 30 -i img%03d.png -pix_fmt yuv420p out.mkv

    また、長時間の連番画像を100フレーム毎などフレームを間引いてタイムラプス(低速度撮影)にする場合は framestep フィルタを使う。

    コマンド例
    ffmpeg -framerate 30 -i img%03d.png -vf format=yuv420p,framestep=100 out.mkv

    参考記事:指定フレーム毎に出力する

  • 1枚画像から動画を作るときのフレームレートを決める -framerate
    これも -r ではなくて -framerate を使う方がより正確であり、公式ドキュメントを見ても設定項目に書いてある

    コマンド例
    ffmpeg -framerate 30 -loop 1 -i img.png -pix_fmt yuv420p out.mkv

    公式ドキュメント:FFmpeg Formats Documentation : image2

    参考記事:【ffmpeg】動画から特定フレームを画像で出力する方法

再生速度の変更

再生速度を変更する場合は以下を参照。

重複フレーム

定期的に重複フレームがあるときは ffmpeg – remove sequentially duplicate frames – Stack Overflow を参考にして以下のようにする。

ffmpeg -i input -vf mpdecimate output
ffmpeg -i input -vf decimate,setpts=N/(24000/1001)/TB output

可変フレームレート

可変フレームレートについては以下を参照。

ちなみにエンコードの出力ログに表示される tbc, tbn, tbr について。

tbr, tbn, tbcはそれぞれの逆数が実際のタイムベースとなる。

  • tbr: 実際にビデオを表示する際に参照するレート。ビデオストリームからの類推値。インタレースだと倍値になってたりする。
  • tbn: コンテナ側に書かれたストリームのタイムベース。
  • tbc: 特定のコーデックにだけ存在するコーデック側のタイムベース。

tbn を修正するには -video_track_timescale を使う。
ffmpeg -i input -c copy -video_track_timescale 30 output

3 thoughts on “ffmpeg でのフレームレート設定の違い

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)