19.98fps映像の処理
描写フレームが19.98fpsのシーンがあるPS1のゲームと出会った。困った。
普通にQTGMCなどのインターレース解除を行うと、静止部分のブレやカクつき、プルつきが目立ち、29.97fpsの元映像をフレーム送りで確認するとプログレッシブとインターレースが規則的に混在する映像の処理をする。
※することは、逆テレシネ処理です。
必要なもの
AviSynth+
TIVTC
AviSynth+の.avsを読み込み出力するソフト(ここではAviUtl)
AviSynth+の導入からAviUtl読み込みと出力
KFMを使ったインターレース解除|kituta
ここを参考にしてください。
※手順2と3は不要ですが、あっても使えます。
手順5もここでは重要ではないですね。
とりあえず、手順4まで進めたらOKだと思います。
TIVTCをダウンロード
Releases · pinterf/TIVTC
から、TIVTC-v(最新).7zをダウンロード。解凍。
C:\Program Files (x86)\AviSynth+\plugins64+ に入れる。
(動かなかったらplugins64にも入れちゃってください)
AviUtl に L-SMASH Works を導入する。
GitHub - Mr-Ojii/L-SMASH-Works-Auto-Builds: Unofficial build of L-SMASH Works
導入方法も記載されています。
.avs スクリプトの作成と実行
.avsファイルを作り、テキストエディタで開き、以下をコピペする。
X = "…" に動画のパスを貼る。(.avsが動画と同じフォルダにある場合はファイル名のみで能う)
.avsをAviUtlのメインウィンドウにドラッグアンドドロップする。
出力する。
記事内の略称
・プログレッシブ(以下p)
・インターレース(以下i)
SetMemoryMax(2048)
X = "hoge.mkv"
AudioDub(LWLibavVideoSource(X), LWLibavAudioSource(X))
AssumeTFF()
ConvertToYV12()
TFM() # TFMでインターレース解除を行い、すべてのフレームをpフレーム化する
# -----------------------------------------------------------
# 周期的なフレームを自動検知して間引く (TDecimate)
# -----------------------------------------------------------
# mode=1: 最適なテレシネパターンを自動で探し、最も重複またはズレたフレームを削除。
# この設定が iフレームの位置を正確に検知し、3フレーム周期から1フレームを間引く。
# pフレームを絶対に残すことを重視し、iフレームの少しの判定逃れは許容する。
TDecimate(mode=1, cycleR=1, cycle=3, dupThresh=1.5, denoise=true, sceneThresh=10.0)
#mode=1
#自動判定
# cycleR=1, cycle=3
# p→i→p のiを除去するため、3フレームごとに1フレームを間引く。(M-in-Nが1-i-3)
#-----------------------------------------------------------------------┐
# 一般的な呼称,正確な計算式(fps),小数点第3位までの数値 ,使用する値
# 30 fps ,"30,000/1,001" ,29.970 fps
# 24 fps ,"24,000/1,001" ,23.976 fps ,cycleR=1, cycle=5
# 20 fps ,"20,000/1,001" ,19.980 fps ,cycleR=1, cycle=3
# 15 fps ,"15,000/1,001" ,14.985 fps ,cycleR=1, cycle=2
# 12 fps ,"12,000/1,001" ,11.988 fps ,cycleR=3, cycle=5
# 10 fps ,"10,000/1,001" , 9.990 fps ,cycleR=2, cycle=3
#-----------------------------------------------------------------------┤
# fps確認用
# cycleR=1, cycle=20, display=true
# 大きい数字と小さい数字から推測する。
#-----------------------------------------------------------------------┘
#dupThresh=1.1(デフォルト値)
#重複フレーム検知の閾値。値を上げることで、削除の基準を厳しくする。
#ノイズ除去後でも、p フレームが動いていると判断される差分を無視しやすくなり、誤削除のリスクを下げる。
#denoise=false(デフォルト)
#判定時に一時的にノイズを除去する
#sceneThresh=15(デフォルト値)
#シーンチェンジ検知の閾値(Lumaの変化率)。
#値を下げると、検知感度が上がる。
#シーンチェンジの検出が速くなり、その周辺での周期的な間引き(mode=1)が一時的に停止する効果が期待できる。
#display=true
#情報を表示する
#** サイクルの中で削除されたフレーム
#(new) 残すフレーム
#(dup) ダブリフレーム。フレーム間の差分が dupThresh 以下であり、削除すべきと強く判断され、削除されたフレーム。
#(mdup)マイナーダブリ。フレーム間の差分が dupThresh をわずかに超えているが、それでも重複度が高いと判断されたが、削除されたフレーム。
# http://www.avisynth.nl/index.php/TIVTC/TDecimate
# -----------------------------------------------------------
# 最終出力 ☆ リサイズは各自調整する。 ☆
# -----------------------------------------------------------
# 自動的に間引き後のフレームレートになる。
#ChangeFPS(59.94) # 59.94fpsにする場合は、ChangeFPS(59.94)を有効化する。
# PAR補正。本来テレビなどで行われるPAR補正の再現をする。
# ソースが4:3の場合(DAR 4:3)は、(640, 480)にする。ソースが16:9の場合(DAR 16:9)は、(854, 480)にする。
Spline36Resize(640, 480)
# 目的の解像度へアップスケール。この時点でアップスケールをしない場合は削除かコメントアウトする
# HDリサイズ(1440x1080)。ソースが16:9の場合は、(1920, 1080)にする。
Spline36Resize(1440, 1080) # 実写・アニメ・ゲーム映像いずれでもバランスよくリサイズできる。本スクリプトでは基準として使用。基本的にはこれを使えば問題ないと思います。
# HDリサイズのオプション(用途に応じて切り替え)
#BlackmanResize(1440, 1080) # 実写映像やノイズを含む素材向き。LanczosResizeをベースにリンギングを抑制した派生フィルタ。Spline36との差は私では判らない程度なので、使用機会が稀。
#PointResize(1440, 1080) # ドット絵(FC/SFC, etc.)や2D(PS1/SS, etc.)ゲーム向き。ピクセル単位を保ったまま拡大するため、補間によるボケは出ない。3D(PS1/PS2, etc.)ゲームでも、当時の粗さを意図して残したい場合はこれを使う。
#ColorMatrix(mode="Rec.601->Rec.709", clamp=0) # 色空間を、BT.601からBT.709に変換する。NTSC規格を録画時に使用する。
return last<解説みたいなね🐈️🐈️🐈️🐈️🐈️>
ソース映像内29.97fpsにおいて、プログレッシブ(以下p)とインターレース(以下i)が規則的に混在する映像。今回は、PS1のゲームで出会った。
・pフレーム(プログレッシブ)
新しい情報を持つ、実質的な映像フレーム
・iフレーム(インターレース)
画像内容は前後のpフレームとダブる、新しい情報を持たないフレーム
[以下のようになっていた]
p→i→p→(繰り返し)(以下この一巡をセットとする)
(画像A→画像Aと画像Bのi→画像B→画像C→画像Cと画像D→画像D→⋯⋯)
iフレームを除くpフレームのみの映像fpsは、29.97×2/3 ≒ 19.98 fps になる。
3フレーム中2フレームのみが新しい動きを持っている。
(元動画をフレーム送りすると、iフレームが前後のpフレームとほぼ同じ情報を持っていると確認できる)
<ざっくりと仕組み🐕️🐕️🐕️🐕️🐕️>
目的は、p→i→pのサイクルから、iフレームだけを消すこと。
まず、iフレームをインタレ解除でpフレームにすると、前pフレーム(A)と実質同じ画像になる。(A’とする)
そして、Aと差がごく僅かである元iフレーム、つまりA’を削除する。
<説明2>
TIVTC内のTFMとTDecimateを用いる。
1.iフレームをプログレッシブ化し、重複判定を分かりやすくする(TFM処理)
p→i→p (画像 A→A/B→B)
↓
p→p→p (画像 A→A'→B)
2.1セットの中で最も重複するフレームを削除する。(TDeicmate処理)
セット内で他のフレームと比べて最も差の小さい(重複する)と判定した元iフレーム(A')を削除する。
p→p (画像 A→B)
これで、19.98fpsになる。
(オプション)
3.19.98fpsを59.94fpsにかさ増しする場合は、ChangeFPS() のコメントアウトを削除し、有効化する。
1フレームを平均3フレームに複製し、59.94fpsの枠に合わせる。
(判定を逃れた元iフレームが混じった場合は、AviSynth側で融通を利かせて59.94fpsにドガチャカと調整してくれる)
<余談>
Decimate(デシメイト)の意味を調べたら、ちょっと刺激的だった。
PS1のゲームでも、アクションシーンのみ19.98fpsなど特定のfpsを使用するゲームはどの程度あるのかは分かりません。
その他のシーンでは、シーンによって以下のどちらか、もしくは下記のmode=7を使い、編集で切り貼りして使い分けると良いと思います。
X = "hoge.mkv"
AudioDub(LWLibavVideoSource(X), LWLibavAudioSource(X))
AssumeTFF()
SeparateFields() #29.97fpsから59.94fps用。プリレンダムービー等
Spline36Resize(640,480)
PointResize(1440, 1080)SetMemoryMax(2048, type=DEV_TYPE_CUDA)
X = "hoge.mkv"
AudioDub(LWLibavVideoSource(X), LWLibavAudioSource(X))
ConvertToYV12()
AssumeTFF()
OnCPU(2)
KFMDeint(mode=1, preset="Slower", nr=true, cuda=true)
OnCUDA(2)
SelectEven() #フレームを間引き、29.97fpsに戻す。PS1/ニンテンドウ64(一部ソフトは除く)など、描写フレームが29.97fpsのソフトが対象になる。確認方法のひとつとして、このフィルターを無効化した状態でフレーム送りを行い、止まっている描写物(メニュー画面やUIなど)が上下に揺れて見える場合は、必要です。
Spline36Resize(640,480) #テレビで行われるPAR補正の再現をする。4:3に補正する。
PointResize(1440, 1080) #SFCや64・PS1などの、ドットの大きいレトロゲーム向き(だと思う)リサイズフィルター
#ColorMatrix(mode="Rec.601->Rec.709", clamp=0) #録画設定が、Rec.601の場合は色空間をRec.709に変更する。行頭の「#」はコメントアウトのため、無効化と同じ意味です(Shift + 3)。
OnCPU(2)
TIVTC/TDecimate - Avisynth wiki
wiki
おまけ
mode7を使う。
X = "hogehoge.mkv"
AudioDub(LWLibavVideoSource(X), LWLibavAudioSource(X))
AssumeTFF()
TFM()
TDecimate(mode=7, rate=29.97, dupThresh=0.4, vidthresh=3.5, denoise=true, display=false)
ChangeFPS(29.97)
Spline36Resize(640,480)
PointResize(1440,1080)mode1では、3フレームのセット内で必ず1フレームを除去する。
mode7では、差分スコアの低いフレームを検知して除去する、と思う。
mode7は楽で良さそうに感じられるけど、捨てられるインタレの情報(例)があるのでインタレ解除目的での使用はおすすめできない。
例:A→B→B/C→D のようなフレームの場合、Cの情報は捨てられるため、BからDに画像が飛んでしまう。
そもそもTIVTCは逆テレシネ用だから、19.98fpsのゲームのアクションシーンで活用できるということが特殊な例だったのかも知れない。
とはいえ、PS1のゲームは一部の格ゲー・レースゲー・音ゲーなどを除けば29.97fpsのプログレッシブ(240p)か疑似インタレ(プログレッシブをインターレース映像にして出力。PsF的)だと思われます。
※ PsF(プログレッシブ・セグメント・フレーム):プログレッシブ映像をインターレース形式に出力したもの
今回のケースでは、
①アクションシーンは固定パターンのp→i→p(19.98fps/29,97fps)
②プリレンダムービーはpとiが混ざり、ボトムフィールドに新規情報を持つiフレームもある(mode=7に向かないシーン)
③アクションシーン以外のシーンでは、p然かi(疑似インタレ)然とした録画映像のどちらかになる。
※③ゲームにおける “i(疑似インタレ)” になるシーンは制作側で意図した挙動ではなく、19.98fpsから29.97fpsにfpsを変更時にフィールド描写順序を初期化していない(fps変更後に、 “必ずトップもしくはボトムフィールドから描写を始める” ような処理をしていない)や、ゲーム機側の処理のもたつき等を原因としたキャプチャ側のフィールドのズレ(フレームごとに、上下フィールドが別フレームから取られた状態)によるもの、の可能性もあります。
kituta 最強シーン切り貼り
①のシーン(アクションシーン)
・mode=1 (mode=7でもいいのかもしれない)
②のシーン(プリレンダムービー)
・ムービーのfpsに拠って、cycleRとcycleを調整するか、KFMDeintを使う
③のシーン
・KFMDeintを使う
①のシーン(p→i→p)では、mode=1の厳密なiフレーム削除とmode=7の自動検知に視覚的な差を感じません。③のシーンでは、mode=7は SeparateFields() よりも綺麗に見えます。
何故、mode=7のrate=29.97で問題なく処理できているように見えるのかはよく解りません。
③のシーンでは、以下の挙動がおそらく②のフレーム処理の終了タイミング次第により混在する。
・正しいプログレッシブの挙動シーン
ゲームハード内の描写
A→B→C→D→E→
NTSC出力時
AA→BB→CC→DD→EE→
(描写フレームをフィールドに分離したインターレース映像だが、上下フィールドは同じ描写フレームなので実質プログレッシブフレーム)
・同期ズレなどよりインターレース然となった挙動シーン
ゲームハード内の描写
A→B→C→D→E→
NTSC出力時
?A→AB→BC→CD→DE→
(描写フレームをフィールドに分離したインターレース映像である、同期ズレにより前後フレームを上下フィールドに結合した1枚のフレームになっている)
②プリレンダムービーでは、事前レンダリングによって生成した映像を出力することで、PS1の処理能力ではリアルタイム生成できない映像の描写をしていたのだと思います。
PS1の多くのゲームは29.97fpsですので、ChangeFPS(29.97)にする。もしくは生のままのfpsにする。
29.97fpsを59.94fpsにしてもフレームを嵩増しするだけで情報量は増えないため無意味であるとも言えます。
※PS1の出力fps(NTSC規格)は720x480 29.97fps 60フィールド
PS1の描写フレーム生成fpsは 640x480 29.97fps 30フィールド(基本)
ですが、59.94fpsに嵩増しすると人の目には滑らかに見える。不思議。※ SeparateFields() 使用時は、性質上59.94fpsである必要があります。
方法は種々様々ありますが、納得と妥協を大事にすると良いと思います。
結局、自分の目で見て違和感がないのであれば、それでいいのです。(金とか貰っているなら別)
一つの方法をメインにして、どこか描写がおかしいと感じたら別の方法も試す、など。
処理後の映像で「ここでフレームが飛んでいるように見える」と思って試行錯誤していたら、ソース映像の該当フレームがもともと飛んでいた、なんてこともあります。
インターレースは、CRT(ブラウン管)においては“滲み”のおかげで問題はなかったのでありましょうが、デジタルでは都合が悪いです。
デジタル上で滲みを再現しても、現代ではそれには「低画質」の烙印が押されるのでしょうね。
CRT再現プラグイン crt_display
Crt display - Avisynth wiki
TIVTC/Doc_TIVTC/TDecimate - READ ME.txt at master · pinterf/TIVTC · GitHub
↑たぶんこっちのほうが最新
TIVTC/TDecimate - Avisynth wiki
履歴
2025-10-10 公開
2025-10-12 加筆
2025-10-30 加筆
2025-11-18 加筆修正
2025-11-27 加筆修正
2026-02-06 ・PAR補正再現のリサイズ方式を変更(ランチョスからspline)・追記を追記
2026-02-18 加筆修正
追記
どうしてわざわざ19.98fpsにエンコードするのか。今思えば不要なコダワリに過ぎないのですが、当時の私がしたかったのでしょうね。
プリレンダムービーの部分に関しても、29.97fps以上の描画にそこだけしているソフトがあるとは思えませんので、不要な工程でしょう。
「インタレ解除→フレーム間引き」の29.97fps化で、すべて済むと思います。
追記
適切なフレームレートにすることで、インタレ解除で生じるゴースト(次のフレームのカラー情報などが重なって見える現象)を消せる利点があります。
