60fps化
つまり
フレーム補間について、今週ずっと調べていました。
色々分かったことがあるので覚書的な感じでまとめておきます
まず、フレーム補間とは、簡単に言うと、既存の動画の動きを”なめらかにする”ことを言います
そのなめらかにする理論はとても簡単で、既存の動画の1秒間のコマ数を倍に補間しているわけです。
ほとんどの動画は30fps(1秒間に30フレーム)なのですが、
その1フレーム目と2フレーム目の間の中間的なフレームを作る…というのを繰り返すことによって、
30fpsが60fpsに、つまり1秒間に60フレームになるわけです。
パラパラ漫画も、同じ動作でも紙の枚数が多ければ多いほどなめらかに見える。
それと同様に、30枚のパラパラマンガの間に更に30枚補うというのが、このフレーム補間
で、その目的は大きく2つに分かれました。
・再生
・変換
この2つ。
とりあえず動画を再生する時にフレーム補間をしてなめらかな映像で見たい場合、
動画をフレーム補間して変換することで常に60fpsの動画にしたい場合
この2つを考えていたんですが、これがなかなか、大変で、
どう大変だったかはもう大変だったので書かないので、
以下ざーーーーっと書いていきます。結果だけ、書きます
その前に、導入方法
かなり大雑把に書くので、分からなかったらググってください
1. 動画再生プレイヤーを入れる(私の場合はMedia Player Classic)
…MPC-HCでもいいと思うが、あまりHCは好きではないので普通のMPCを用いる。色々あるので
…MPC-HCの場合32bitと64bit版があるが、プレイヤー自体はどっちでもいいかも。
…MPCの場合は、オプション→外部フィルタから「フィルタの追加」を押し、2でffdshowをインストールした際にフィルタ一覧にffdshowのデコーダー(ffdshow video decoderなど)が表示されているはずなので、それを追加すること
2. 動画コーデック「ffdshow(clsid)」をインストールする
…この際、InterFrame(後述)で補間したい際は64bit版は対応してないので32bit版をインストールすること。
…「MBlockFps」(後述)で補間する場合は32/64どちらでもいいです。
…インストールする際に「AviSynth」のチェックがある項目がありますが、それは外さないでください。デフォルトではチェックになっていると思いますので、大丈夫だと思いますが。
…ffdshowのビデオデコーダーの設定から、「コーデック」を開き、フレーム補間をしたい動画の形式の"デコーダー"を"libavcodec"とする

3. Avisynthの公式版(2.5)をインストールし、マルチスレッド対応が○になっている非公式版を手順どおりに上書きする
…これも2と同じくInterFrameは64bit版は対応してないので32bit版をインストールすること。
…私は公式版「v2.5.8 Final」をインストールした後、非公式版「v2.5.8 SEt ビルド」をダウンロード。
3.1 その後、同梱の「avisynth.dll」をC:\Windows内の、32bitOSなら"System32"に、64bitOSなら"SysWOW64"フォルダにコピー
…たしか64bitでもSystem32に入れると自動でSysWOW64にコピーしてくれたはずですが、dllが使用中だったりするとコピーしてくれないことがあるので、OS別に自分で入れたほうがより確実です。そうしましょう。
3.2 同じく同梱されているMT.dllを
Program Files(もしくはProgram Files(x86))→AviSynth 2.5→pluginsフォルダにをコピー
4.「MVTools v2」をダウンロードし、中にあるmvtools2.dllを
Program Files(もしくはProgram Files(x86))→AviSynth 2.5→pluginsフォルダにコピー
MT.dllとmvtools2.dllはマルチスレッド化のために使われます。そっちのほうが、いい感じです
と長くなるんですが、ここまでの流れを
知恵袋の良い感じの回答者が上手くまとめてるんで、
そこを見ると、良い感じです。
また、「InterFrame」によってフレーム補間をしたい場合は、
「
InterFrame 1.13」を導入する必要があります。
InterFrameのほうがフレーム補間としては高性能(ただし難有り・後述)なので、入れておいて損はない。かも。
(オプション)InterFrame導入方法
「InterFrame 1.13」をダウンロード、中にある「InterFrame.avsi」、"Dependencies"フォルダ内にある「mvtools2.dll」を、Program Files(もしくはProgram Files(x86))→AviSynth 2.5→pluginsフォルダにコピー。
…他のdllも気になったら、fftw3.dll以外のDLLもpluginsフォルダに入れて問題無いです
…fftw3.dllは、avisynth.dllと同様に32bitOSなら"System32"に、64bitOSなら"SysWOW64"フォルダにコピー。忘れがちなので、念のために。覚書。
これで準備は整った…かもしれない、たぶん
実際、導入部分が一番ゴチャゴチャしていて、ここを間違えると再生も変換もエラーしか出なくなる
導入さえちゃんとできれば、あとは、楽、なはず。
1.再生
フレーム補間には「MBlockFps」(たぶん)と「InterFrame」の2種類があり、
どちらでもフレーム補間が出来る。ここで問題となるのが「ブロックノイズ」と「負荷」
MBlockFPSでフレーム補間をすると、InterFrameより断然軽い負荷でフレーム補間できる
私の環境(Win7 64bit,CPU i7 860,メモリ 8.0GB, GPU GTX 260、以下・私の環境)では、
フルHDの動画でも気にならない程度の負荷でフレーム補間できた。
が、
補間したフレームにブロックノイズが出来る。
これが実に残念。フレーム補間したフレームのほぼ全てにブロックノイズが出来る。
負荷が軽いのでしょうがないが、気になる人にはとても気になる。
ただし普通に再生してる分には1/60秒のフレームなので気にはならない。 …こともない。
以下MBlockFPSを用いたAvisynth用スクリプト
SetMemoryMax(3000)
SetMTMode(5,8)
ffdShow_source()
SetMTMode(2)
super=MSuper(pel=2, hpad=0, vpad=0)
backward_1=MAnalyse(super, chroma=false, isb=true, blksize=16, blksizev=16, searchparam=3, plevel=0, search=3, badrange=(-24))
forward_1=MAnalyse(super, chroma=false, isb=false, blksize=16, blksizev=16, searchparam=3, plevel=0, search=3, badrange=(-24))
backward_2 = MRecalculate(super, chroma=false, backward_1, blksize=16, blksizev=16, searchparam=2, search=3)
forward_2 = MRecalculate(super, chroma=false, forward_1, blksize=16, blksizev=16, searchparam=2, search=3)
backward_3 = MRecalculate(super, chroma=false, backward_2, blksize=8, blksizev=8, searchparam=1, search=3)
forward_3 = MRecalculate(super, chroma=false, forward_2, blksize=8, blksizev=8, searchparam=1, search=3)
MBlockFps(super, backward_2, forward_2, num=60, den=1, mode=0)
SetMTMode(1)
GetMTMode(false) > 0 ? distributor() : last
SetMemoryMaxの値は大雑把でも良いです、現に私がそれで再生できています。
ですがもちろん、メモリが少ない方は値を小さくしたほうがいいかもしれません。
このスクリプトを、「ffdshowのビデオデコーダーの設定」の"AviSynth"にチェックを入れ、
・ffdshowのビデオソースを追加する のチェックを外し
・3:2 プルダウンは、「プルダウンを無視する」にし、
・入力色空間は「YV12」のみにチェックを入れ、
・バッファー(後方/前方)は[0]と[10](適当でもいいらしいが)
とした上で上記スクリプトを貼り付ける
こんな感じに

これで、「MBlockFps」(たぶん)によるフレーム補間再生ができているはずです。
確認方法としては、上記の知恵袋にも書いてるんですが、色々面倒なので、
目視。自分の目で確認してみください。
でも微妙な時もありますよね
そういうときはやはり、「ffdshowのビデオデコーダーの設定」の、「オンスクリーンディスプレイ」から、
・現在のフレーム にチェック → コマ送り(矢印キーなどで可能)した時に、
「現在のフレーム」が2フレームに1個進むと正常(例:1→1→2→2→3→3…)
・フレーム継続時間 にチェック → 「フレーム継続時間」が16.6ぐらいになってたら正常
だいたいこの2つが正常なら、60fps化・フレーム補間できてます。ヤッタネ!
ちなみに
動画上部に黄色い文字で英文が表示されている場合は失敗してますこの黄色文字のエラー文が怖いので怖くしてみました。怖いんです。
ずっと試行錯誤した結果、その原因は主に
・AviSynth用のスクリプトが間違ってる
・日本語が混ざってる("じゃなくて”だったり)
・インストールが間違ってる、system32とsysWOW64をちゃんと区別できていない
・ffdshow、AviSynthが32bit版、64bit版でごっちゃになってる(InterFrameは64bit非対応)
こんな感じ、とにかく32bit版と64bit版の違いによるエラー文が多かったです。くわばらくわばら。
で、InterFrameを導入した場合は、InterFrame用のスクリプト
スクリプトを、書き換えるだけ。
SetMemoryMax(3000)
SetMTMode(1,0)
ffdshow_source()
SetMTMode(2)
InterFrame(GPU=true, Preset="Very Fast", Tuning="animation",FlowPath="C:\Program Files (x86)\AviSynth 2.5\plugins\")
GetMTMode(false) > 0 ? distributor() : last
こんな感じに

InterFrame(GPU=true, Preset="Very Fast", Tuning="animation",FlowPath="C:\Program Files (x86)\AviSynth 2.5\plugins\")
の部分が、InterFrame。そりゃそうだよ。
FlowPath=の部分は、もちろんAviSynth 2.5\plugins\までのフルパス。
64bit版の場合はC:\Program Files\AviSynth 2.5\plugins\となりますが、
InterFrameは64bit版被対応なので、まずそういうことは、ないはず。
Preset="Very Fast"やTuning="animation"は、プリセット毎に変えたほうがいいと思うんですが、
ここの値は結構多そうなのでそこらへんは、
ググってください。色々あります。
フレーム補間の確認方法も上記のオンスクリーンディスプレイでOK!
ただし
InterFrameによるフレーム補間再生は重い私の環境では、途中から絶対カクカクになるし、別の動画を読みこませようとしたら高確率でMPCが固まる
そんなハイスペック推奨のInterFrame補間再生、是非お試しを。
これで再生におけるフレーム補間、バッチリダネ!たぶん
もう指が、疲れました、動きません。
がんばってください、わかりました、はい次は変換
2. 変換
もう再生の項目で全力を尽くした感じなので、ここはすごい大雑把にいきます
変換に使うツール:
aviutlなお、変換方法とかはまた別の話なので、例えば主流のH.264(mp4)変換なんかは
まとめwikiを参照してください最新版のaviutlは、avs(AviSynthのスクリプト)がそのまま読み込めるので、avsを作ります。
なお、「MBlockFps」(たぶん)で変換するとブロックノイズが現れて美しくありません、
という個人的理由でInterFrameによる変換のみを扱います。ごめんなさい。
「MBlockFps」(たぶん)による変換方法は
ググれば出ると思います1. まずメモ帳か何かを開き、以下の文字列をコピー、ペースト
↓
#DirectShowSource("動画のフルパス",convertfps=true)
AVIsource("動画のフルパス")
ConvertToYUY2()
InterFrame(FlowPath="C:\Program Files (x86)\AviSynth 2.5\plugins\",GPU=true, Preset="Very Fast", Tuning="animation")
↑
この4行をコピー、ペーストしたら名前を付けて保存する際に"ファイルの種類"をすべてのファイル(*.*)にし、
「(適当なファイル名).avs」で保存しましょう。なんでもいいです。どこでもいいです。
まず各行の説明
1行目、は飛ばしまして
2行目に動画のパスを入れます。.aviにしか対応していないので、基本的に.aviファイルを読み込ませましょう。
もちろんフルパス(C:\~だったりD:\~から始まる動画のパス。拡張子までちゃんと)で入力
3行目は動画の色情報を変換するのですが、どうせ元からYUY2でも変換しても支障は無いので、ようはそのままで。
4行目は、再生の際と同じInterFrame。ちゃんとFlowPath=が正しいか確認しましょう。
こうして出来たavsファイルをaviutl(もしくはavsに対応した動画編集ソフト)で
開くだけ。後は開いた時点で自動でフレーム補間されてます。いつもどおり変換してください。
おしまい。ちゃんちゃん。ちゃんちゃかちゃん。
ちなみに1行目のDirectShowSource、
avi以外の動画拡張子も読み込めるようになる夢の様な機能ですが
なぜかmp4に変換した際、映像が黒一色になるバグが発生してます。
使った当時のx264GUIが古かったからでしょうか、たぶん今は大丈夫かも。
aviにするのが面倒って方は、是非DirectShowSourceを使ってみてください。
使い方は、先頭の#を外して、同じく動画のフルパスを入力。代わりに2行目の先頭に#をつけましょう
#とは、コメントアウトといって、avsに反映させずにコメント扱いすることができる偉いシャープさん
こんなもんで、
研究結果です。調べつくしたあらゆるフレーム補間のことを、大雑把に、バラバラに、書き上げました
たぶん雑すぎてどこか抜けてます、でもそれはしょうがない
文章のフレーム補間もなんたらかんたら