View on GitHub

29.97fps→25fps逆テレシネ(IVTC)ガイド

A guide for IVTC from 29.97fps to 25fps

29.97fps→25fps逆テレシネ(IVTC)ガイド


目次

  1. 初めに
  2. 25fpsテレシネソースの周期解説
  3. 実施の前に(TDecimateを使用する理由・目的)
  4. 逆テレシネの実施
  5. Cycle内の重複フレーム数が33ではない場合の処理方法
  6. 最後に(謝辞)

1. 初めに

25fpsから29.97fpsへテレシネされた、アジア圏産やヨーロッパ圏産、極まれにアメリカ産のソースを放送する番組があります。
これらのソースを、元の25fpsへ逆テレシネしようと、インターネット上で検索をしましたが、探し方が悪いのか、いくら探しても有益な情報を見つけることができませんでした。
情報がないのであれば自分で色々と試してみるしかないかと、長期に渡り試行錯誤を繰り返していましたが、正確に逆テレシネを行うことができる方法を見つけることができました。
同様に情報が見つけられない方のために、本ガイドを作成し、公開します。

なお、私はプログラマーではないため、気の利いたツールは用意できていません。
マクロも設定していないスプレッドシートとテキストエディターで、コピペと編集を繰り返す完全な手作業となります。
そこにテレシネ素材があったら逆テレシネしないと我慢できないという、もはや手段そのものが目的になってしまっている方に向けた、とても手間暇の掛かる方法です。
逆テレシネに時間や労力を掛けたくない方は、29.97fpsのままとするか、59.94fps化にする方が、簡単で手間入らずです。

また、あくまでも私が探せていないだけで、実際には、もっと簡単に同じことが実現できる方法やプラグインやスクリプトが、既に世の中に存在するかもしれません。
もしご存知でしたら、教えていただけますと幸いです。


2. 25fpsテレシネソースの周期解説

25fpsを29,97fpsへテレシネしたソースは、一定の間隔でフレームが重複しています。
この間隔を観察していると、一定の周期で繰り返されていることに気が付きます。
この周期も観察していると、更に一定の周期で、周期自体がずれていくことに気が付きます。

◇観察より導き出した周期の特徴

表1. Cycleの組み合わせパターンと構造

No. 先頭 中間(順不同) 末尾 繰返数 備考
1 1ND6 32ND5 / 32Dup 1Dup 6  
2 1ND5 31ND5 / 32Dup / 1ND6 1Dup 6*32=192 繰返6回*ND6移動32回
3 1ND5 32ND5 / 33Dup 1ND1 7 先頭ND5+末尾ND1=ND6
4 1ND4 31ND5 / 33Dup / 1ND6 1ND1 6*32=192 繰返6回*ND6移動32回
5 1ND4 32ND5 / 33Dup 1ND2 7 先頭ND4+末尾ND2=ND6
6 1ND3 31ND5 / 33Dup / 1ND6 1ND2 6*32=192 繰返6回*ND6移動32回
7 1ND3 32ND5 / 33Dup 1ND3 7 先頭ND3+末尾ND3=ND6
8 1ND2 31ND5 / 33Dup / 1ND6 1ND3 6*32=192 繰返6回*ND6移動32回
9 1ND2 32ND5 / 33Dup 1ND4 7 先頭ND2+末尾ND4=ND6
10 1ND1 31ND5 / 33Dup / 1ND6 1ND4 6*32=192 繰返6回*ND6移動32回
11 1ND1 32ND5 / 33Dup 1ND5 7 先頭ND1+末尾ND5=ND6
12 1Dup 31ND5 / 32Dup / 1ND6 1ND5 6*32=192 繰返6回*ND6移動32回
13 1Dup 32ND5 / 32Dup 1ND6 6  
14 1Dup 33ND5 / 32Dup 1Dup 1 34Dup

表2. Cycleのフレーム数と重複フレーム(Dup)数

No. 構成要素 フレーム数 Dup数 繰返数 合計フレーム数 合計Dup数
1 1ND6+32ND5+33Dup 199 33 6 1,194 198
2 32ND5+33Dup+1ND6 199 33 192 38,208 6,336
3 33ND5+33Dup+1ND1 199 33 7 1,393 231
4 1ND4+31ND5+33Dup+1ND6+1ND1 199 33 192 38,208 6,336
5 1ND4+32ND5+33Dup+1ND2 199 33 7 1,393 231
6 1ND3+31ND5+33Dup+1ND6+1ND2 199 33 192 38,208 6,336
7 1ND3+32ND5+33Dup+1ND3 199 33 7 1,393 231
8 1ND2+31ND5+33Dup+1ND6+1ND3 199 33 192 38,208 6,336
9 1ND2+32ND5+33Dup+1ND4 199 33 7 1,393 231
10 1ND1+31ND5+33Dup+1ND6+1ND4 199 33 192 38,208 6,336
11 1ND1+33ND5+33Dup 199 33 7 1,393 231
12 32ND5+33Dup+1ND6 199 33 192 38,208 6,336
13 32ND5+33Dup+1ND6 199 33 6 1,194 198
14 33ND5+34Dup 199 34 1 199 34
- 合計 - - 1,200 238,800 39,601


周期は、最初から最後まで崩れることなく、流れるようにきれいに揃っているソースもあれば、Cycleの途中から突然変化するソースもあります。

◇イレギュラーな周期変化が発生する主な箇所

※全てテレシネ後のカット編集が原因と考えられます。

また、全ての25fpsのテレシネソースが、この周期に当てはまれば良いのですが、中には異なる周期を持つ(または周期を持たない)ソースもあります。

◇異なる周期や周期を持たないソース

これらのソースは、本ガイドの方法で逆テレシネすることが難しいため、29.97fpsのままとするか、59.94fps化を検討しましょう。


3. 実施の前に(TDecimateを使用する理由・目的)

2章の周期に従って重複フレームを間引くことができれば、元の25fpsを復元(逆テレシネ/Inverse Telecine(IVTC))することができます。
重複フレームを間引くために、AviSynthのプラグインTIVTCに含まれるTDecimateを使用します。

TDecimateは、パラメーターCycleに指定したフレーム数の範囲内から、パラメーターCycleRに指定したフレーム数を間引きます。

間引かれる対象のフレーム33個は、基本的に、一つ手前のフレームとの差分が最も小さいと判定された順番に選ばれます。

そのため、単色(主に白や黒)、ほぼ動きがない(または完全にない)といったシーンがあると、周期に従って存在する重複フレームよりも差分が小さいと判定されて間引く対象として選ばれてしまい、優先的に間引かれてしまう原因になります。

また、字幕は通常テレシネ後に付加されるため、重複フレームと1つ手前のフレームの間に字幕の切れ目があると、字幕の有無により動きがあると判定されて間引く対象から漏れてしまい、その分本来残すべきフレームが代わりに間引かれてしまう原因になります。

なお、Overlayフィルターを使用して、字幕表示エリアをマスクした状態でTDecimateに重複判定させることで、字幕の有無による意図しない判定を防ぐ方法がありますが、マスクしている部分にのみ動きがあるシーンがあった場合には、同じく意図しない判定が行われてしまう原因となるため、話としては余り変わりません。

上に記載した通り、23.976fpsの逆テレシネの場合は、5フレーム毎に1フレームを間引くだけなので、多少意図しない判定があっても、視聴時に気付きづらいと思います。
しかし、25fpsの逆テレシネの場合は、199フレーム毎に33フレームを間引くため、意図しない判定が、視聴体験に影響する可能性が高くなります。

余談ですが、インターレースソースを29.97fpsから25fpsへ逆テレシネするためにSrestoreスクリプトを使用する方法は良く知られていますが、字幕がある場合は同様に、重複フレームと1つ手前のフレームの間に字幕の切れ目があるせいで重複フレームがそのまま残り、本来残すべきフレームが代わりに間引かれています。

◇意図しない重複判定が起こるよくある原因まとめ

もちろん、視聴する本人が気にならないのであれば、何ら問題ではありません。
気になるのであれば、これらの意図しない重複判定を防ぎつつ、周期に従って完全に意図した重複フレームを間引く必要があります。

そこで使用するのが、TDecimateのパラメーターovrです。

つまり、全てのフレーム毎の間引く・残す情報を記載したテキストファイルを用意して、ovrで読み込むことで、100%意図した通りにフレームを間引くことができる、ということです。


4. 逆テレシネの実施

◇必要なアプリケーション・プラグイン・ファイル

◇前提とするソース

◇AvsPmod設定

Ctrl+Left/Rightで表示Cycleを切り替えられるようにします。

◇25fpsIVTCforTDecimate.xlsxの説明

2章の周期を実際に記載した一覧です。
※マクロは使用していません。

(1) 事前準備

TDecimateのパラメーターovrで読み込むための空のテキストファイルを作成し、任意のファイル名で任意のパスに保存します。(このガイド内では”C:\ovr\ovr.txt“とします。)
このテキストファイルは、任意のテキストエディターで開いておきます。
また、任意のスプレッドシートエディターで、25fpsIVTCforTDecimate.xlsxを開いておきます。

(2) 周期表示

①周期を表示するために、AvsPmodに以下を記述します。

# 動画読み込みプラグイン("動画ファイルパス")
# 例)
# lwlibavvideosource("x:\xxx\xxx.ts",dr=true,repeat=true)
# Trim(x,y)

TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt",sdlim=-5,display=true,displayOpt=6)

# ovr="" に(1)で作成したテキストファイルを指定します。

# sdlimの指定は任意のため、以下でも可
# TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt",display=true,displayOpt=6)

# TDecimateの一覧が見づらければ任意にリサイズ
# 例)
# BlackmanResize(1280,720)

return last

②F5キーでプレビューを表示し、TDecimateの一覧を確認します。

(3) ovrで読み込むファイルの作成

①25fpsIVTCforTDecimate.xlsxの一覧から、TDecimateの一覧と合致する行(Cycleグループ)を探します。

  1. Cycleの先頭の重複フレームまでのフレーム数を確認する
    • TDecimateの一覧の最初のマーク(“**“)までの重複がない連続フレーム数と、25fpsIVTCforTDecimate.xlsxのD列の先頭の”+“の連続数が同じCycleに絞ります。
  2. ND6を探す
    • TDecimateの一覧では、”displayOpt=6“の指定により、ND5のマークは”**“、ND6のマークは”>>“と表示されます。
    • 25fpsIVTCforTDecimate.xlsxのD列では、ND6は”`++++++-`“と表され、赤字で書かれています。
      (ただし、ほとんどの行は横幅を広げたり改行したりしないと”`++++++-`“は見えないため、TDecimateの一覧で先頭からまたは末尾から何番目にND6があるのかを数えて、同じくA列の番号で、先頭からまたは末尾から何番目かを数えた方が現実的です。)
    • TDecimateの一覧に一つも”>>“が存在しない場合は、ND6がCycleを跨っている、 No.3, 5, 7, 9, 11に該当します。(完全に周期に従ってフレームが配置されている前提)
    • TDecimateの一覧で、間引く対象のマーク(“<<”,”**”,”>>“)が周期通りに配置されておらず探しにくい場合は、Ctrl+Left/RightでCycleを切り替えます。

②合致する行(Cycleグループ)が見つかったら、B列、C列を書き換えます。

③E列を必要な分コピーして、ovrで読み込むファイルに貼り付けて保存します。

(4) ovr指定後の確認

①AvsPmodでF5キーを押して再読み込みを行い、ovrで読み込むファイルに保存した範囲と同じ範囲のTDecimateの一覧を確認します。

②ovrで読み込むファイルに、全てのフレームの指定を行い、AvsPmodでの目視確認も完了しましたら、残るはエンコードするのみです。

(5) 後工程

avsファイルを読み込み可能な任意のエンコードアプリケーションでエンコードを実施してください。


5. Cycle内の重複フレーム数が33ではない場合の処理方法

No.14のCycle(重複フレーム数34)や、TVコマーシャル等によるCycle内の周期変化により、Cycle内の重複フレーム数がCycleRの指定数33と異なる場合があります。

Cycle=199“で25fpsを維持する場合に間引かれるフレーム数は、33個固定です。
例えovrで読み込むファイル側で”-“を33個から変更しても、TDecimate側で自動的に調整して33個が維持されます。
それを踏まえてどうにかしようと編み出した方法を説明します。

◇方法1. 周期を変える

ソース自体のTrim指定の先頭フレームの開始位置を変更し、強制的に周期をずらすことで、No.14のCycleの余計な重複フレームを回避できる場合があります。

開始位置を変更することにより、その分不要なフレームが含まれることになるため、TDecimateのあとに、25fpsへ変換後のフレーム番号で追加のTrimを書けばカット可能かと思います。
Amatsukaze使用の場合は、動画入力後の時間(長さ)の変更は許可されていないため、エンコード実施後に、TMPGEnc MPEG Smart Render等の動画編集アプリケーションでカット処理を行ってください。

◇方法2. 同一Cycle内で置き換える

対象のCycle内に、動きが少ないシーンがある場合は、間引くフレーム或いは残すフレームを、その箇所のフレームで処理してしまうのも悪くない選択です。
この場合は、ovrで読み込むファイルの該当Cycle部分を直接編集し、AvsPmodで確認しましょう。
編集する際の注意点は、4章に記載の通りです。

◇方法3. 大きなCycleを指定して離れたフレームと置き換える

最後に案内する方法ですが、間引き処理にこだわりたい方(私)には本命です。
3章で説明した通り、TDecimateは、Cycleに指定したフレーム数の範囲内から、CycleRに指定したフレーム数を間引きます。
ここまで、”Cycle=199“、”CycleR=33“と固定でしたが、より大きな値を指定することで、より広い範囲で間引くフレームを選択することができるようになります。

Cycleに大きな値を指定する際の注意点

例1.) 40596-40794のCycleの重複フレーム数は34で、49750-49948のCycleの重複フレーム数は32である

v1=Trim(0,40595).TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr-1.txt",display=true,displayOpt=6)
v2=Trim(40596,49948).TDecimate(mode=0,cycleR=1551,cycle=9353,ovr="c:\ovr\ovr-2.txt",display=true,displayDecimation=199,displayOpt=6)
v3=Trim(49949,0).TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr-3.txt",display=true,displayOpt=6)
v1++v2++v3

例2.) 78008-78206のCycleの重複フレーム数が32しかないが、もう1フレームを間引くための適当なフレームが見つからない

v1=Trim(0,78007).TDecimate(mode=0,cycleR=33,cycle=199,ovr="c:\ovr\ovr-1.txt",display=true,displayOpt=6)
v2=Trim(78008,0).TDecimate(mode=0,cycleR=99,cycle=597,ovr="c:\ovr\ovr-2.txt",display=true,displayDecimation=199,displayOpt=6)
v1++v2

# 不要なフレームをカット
# Trim(0,65533)

捕捉:Trimで分割する場合の注意


6. 最後に(謝辞)

TIVTCは、AviSynthを使用する方にはおなじみのプラグインだと思いますが、私にとっては、AviSynthを使ういくつかの理由の(大きな)一つです。
特に、本ガイドの29.97fpsから25fpsへの逆テレシネは、Cycleに”199“を指定可能、且つ、外部ファイルを読み込んで間引き情報をコントロール可能なTDecimateがあったからこそ、発想を実現することができ、成り立っています。
同じことができるDecimationプラグインを他に知りません。
オリジナルの開発者triticalさんと、現在も更新し続けてくださっているpinterfさんに、感謝申し上げます。

最後までお読みいただいてありがとうございました。
本ガイドがお役に立てば何よりです。


改訂履歴


権利情報

29.97fps→25fpsの逆テレシネ(IVTC)ガイド © 2023 Ikotas

This work is licensed under CC BY 4.0