Skip to content

Latest commit

 

History

History
549 lines (433 loc) · 42.1 KB

index.md

File metadata and controls

549 lines (433 loc) · 42.1 KB

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

(English and other languages) by Google Translate


目次 (改訂履歴)

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

1. 初めに

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

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

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


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

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

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

  • 周期は、33個の重複フレームを持つ連続する199フレームの集まりで構成されます。
    この連続する199フレームを Cycle とします。

  • Cycle内の重複がない連続フレーム数は、以下の通りです。

    • 先頭フレームから最初の重複フレームまで… 0~6フレーム
    • 最初の重複フレームから最後の重複フレームまでの間… 5または6フレーム
    • 最後の重複フレームから最終フレームまで… 0~6フレーム

    この重複しない連続フレームを、"NDn" (Non Duplicate n frame(s)n=1-6) とします。
    また、重複フレーム自体を、"Dup" (Duplicate frame(s)) とします。

  • Cycle内のND1-6とDupの組み合わせパターンは200通りあり、1つの組み合わせを規定回数繰り返したのち、次の組み合わせに移行します。
    この規定回数繰り返す組み合わせパターンを Cycleグループ とします。

  • Cycleグループは決まった順序に従って200通り移行すると、また1から繰り返します。

表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
  • 簡潔に表すために、200通りの組み合わせパターンの内、No.2, 4, 6, 8, 10, 12の中間部分の各32通りの組み合わせパターンを省略しています。
  • No.1-14で周期全体を表しており、No.14の次は、またNo1から始まります。
  • No.7を折り返し中間点として、No.1からNo.13まで対称になっています。
  • No.14は、Cycle末尾に重複フレームが1つ余計に存在します。
    テレシネの帳尻を合わせるための調整用Cycleだと考えられます。
  • 全体を通して、6Cycleまたは7Cycle毎に、ND6は次のND5と入れ替わって後方へ移動していき、周回します。
    • ND6のCycle内の移動は、最初の重複フレームから始まり、最後の重複フレームまで、6Cycle毎に32回繰り返します。
      • 対象No.2, 4, 6, 8, 10, 12
    • ND6が最後の重複フレームに到達した次のCycleグループでは、ND6はCycleの末尾から次のCycleの先頭に掛けて分かれて跨ることになります。
      また、その状態のCycleは、7回繰り返します。(7Cycle)
      • 対象No.3, 5, 7, 9, 11
    • ND6がCycle内を一周するたびに、最初の重複フレームの位置が1フレームずつ前方にずれていき、全体で6周すると、元の形に戻ります。
      • 1周目…No.1-3、2周目…No.4,5、3周目…No.6,7、
        4周目…No.8,9、5周目…No.10,11、6周目…No.12-14

表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のテレシネソースが、この周期に当てはまれば良いのですが、中には異なる周期を持つ(または周期を持たない)ソースもあります。

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

  • 23.976fpsテレシネや29.97fps等の、元が異なるフレームレートのソースと結合されているソース
  • 何度も編集を繰り返されたことにより周期が壊れているソース
  • テレシネ化の実施手法が異なるソース
  • その他不明な理由で周期が異なるソース

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


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

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

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

  • 2章のCycleをTDecimateに当てはめると、以下の設定になります。
    ※そのまま、29.97fpsを25fpsへ間引く設定となります。

    • 29.97fps→25fps:CycleR=33,Cycle=199
  • 参考までに、29,97fpsを23.976fpsへ間引く場合の設定です。

    • 29.97fps→23.976fps:CycleR=1,Cycle=5

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

  • modedupThreshsdlim等のパラメーターの指定により、選択される対象をある程度コントロールできますが、その対象の中では、常に差分が最も小さいと判定された順番に選ばれます。

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

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

  • 字幕の有無は、シーンチェンジ並みの大きな動きとして判定されることが多いため、何も対策しなければ重複と判定されることはまずありません。

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

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

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

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

  • 単色(主に白や黒)、ほぼ動きがない(または完全にない)といったシーン
  • テレシネ後に追加された字幕
    • 重複フレームと1つ手前のフレームの間に字幕の切れ目がある部分
  • Overlayフィルターを使用してマスクした部分にのみ動きがあるシーン

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

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

  • ovrは、任意のテキストファイルを読み込み、そこに記述された通りにフレームを間引くことができます。
  • ovrの指定は、他の全てのパラメーターの指定を無視して優先されます。

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


4. 逆テレシネの実施

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

  • AviSynthPlus ※バージョン指定なし、AviSynthNeo-r2827でも可
  • AvsPmod ※最新版推奨 (記載時点:v2.7.8.8)
  • TIVTC ※最新版推奨 (記載時点:v1.0.29)
  • 任意の動画読み込みプラグイン(LSMASHSource、FFMpegSource等)
    • エンコードアプリケーションと同じ出力結果である必要があります。
      動画読み込みプラグイン自体、或いは、プラグインのオプションを指定できないアプリケーションでエンコードを行う場合、AvsPmod上では正しく指定できているのに、エンコード後の間引き結果が異なる場合があります。
      その場合は、エンコードアプリケーションと同じ出力になるように、このプラグインに指定するオプションやプラグイン自体を変更してみる等、試行錯誤してください。
      (普段、Amatsukazeを使用していますが、AvsPmod側のLSMASHSourceのオプション指定が原因で、どうしても結果が合わずに悩んだ経験があります。)
  • 任意のテキストエディター
  • 任意のスプレッドシートエディター
  • 25fpsIVTCforTDecimate.xlsx

◇前提とするソース

  • 全フレームがプログレッシブフレームである、25fpsを29,97fpsへテレシネされたソース
    • インターレースソースは、TDecimateの前にYadifMod2等のプラグインでインターレース解除をすることで、本ガイドの方法を実施可能です。
    • 24.975fpsは対象外ですが、こちらは"CycleR=1,Cycle=6"するだけです。

◇AvsPmod設定

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

  • カスタムジャンプサイズ:166
  • カスタムジャンプサイズの単位:フレーム
  • カスタムショートカット
    • ビデオ(V) -> 移動(N) -> x進む:Ctrl+Right
    • ビデオ(V) -> 移動(N) -> x戻る:Ctrl+Left

◇25fpsIVTCforTDecimate.xlsxの説明

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

    • Cycleグループ(フレームの配置が同一のCycleのまとまり)毎に1行です。
    • 1行目A列No.1から200行目A列No.14までで周期全体となります。
      • 200行目の次は、1行目に戻ってください。
    • A列…表1.のNo.に相当する番号(No.2, 4, 6, 8, 10, 12は枝番付与)
      • 背景色を次の通りに塗り分けています。
        • No.1, 13 … 緑色
        • No.2, 4, 6, 8, 10, 12 … 青色
        • No.3, 5, 7, 9, 11 … 黄色
        • No.14 … 赤色
    • B列…Cycleグループの先頭フレーム番号
    • C列…Cycleグループの最終フレーム番号
      • 編集するのは、この2列です。
      • 初めから値が入っていますが、実際のソースの周期は、1行目から始まるとは限らないため、途中の行を適宜書き換えていくことになります。
    • D列…Cycle内の全フレームを"+"と"-"で表したもの
      • この列は編集しないでください。
      • "+"は残すフレーム、"-"は間引くフレームです。
      • 目安となるND6を見つけやすいように、該当箇所"++++++-"を赤字にしています。
    • E列…B列~D列を結合した値
      • この列の値をovrで読み込むファイルに貼り付けます。

(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
  • ovrで読み込むファイルのパス・ファイル名は環境に合わせて編集してください。

  • パラメーターsdlimは、間引く対象の間隔を指定します。
    "sdlim=-5"とすることで、なるべく間に5フレーム挟んだ間隔で対象を選択します。
    ※"なるべく"と書いた通り、実際はそうならないこともよくあります。
    ※必須のパラメーターではないため、省いても問題ありません。

  • パラメーターdisplayは、デバッグ情報の表示を制御します。
    "display=true"とすることで、画面に一覧を表示します。
    エンコードする際は、"display=false"とするか、パラメーター自体を削除するか、のどちらかをしないと、エンコード後の再生画面にも一覧が表示されますので、ご注意ください。
    (この場合は、パラメーター指定を修正して再度エンコードし直すしかありません。)

    • AviSynth本体はGUIを持たず、処理結果を表示する画面を持たないため、動画自体に文字情報を埋め込み、エンコード後の再生画面で処理結果を確認する仕組みになっています。
      AvsPmodは、エンコードを行わずに処理結果を確認できるようにしたフロントエンドですので、この仕組みは変わりません。
  • パラメーターdisplayOptは、間引く対象に表示するマーク("**")を、マークからマークまでの距離に応じて出し分けるようします。("<<","**",">>")
    今回は"displayOpt=6"とすることで、一つ前のマークから数えて6個目に表示されるマークは標準の"**"、それより少ない距離の場合は"<<"、多い距離の場合は">>"と表示されます。 Cycle内で最も多く登場する連続フレーム数+1を指定すると、最も見やすいと思います。

    • displayOptは、2023.12.10 GMT+9にリリースされたバージョン(TIVTC v1.0.28/TDecimate v1.0.10)で追加されました!
  • パラメーターの詳細説明やその他のパラメーターについては、TDecimateのドキュメントを参照してください。

②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列を書き換えます。

  • B列…Cycleグループの先頭フレーム番号
  • C列…Cycleグループの最終フレーム番号
    • Ctrl+Left/RightでCycleを切り替えて、合致したCycleグループの最初のCycleと最後のCycleを探し、最初のCycleの先頭フレーム番号をB列に、最後のCycleの最終フレーム番号をC列に書きます。
    • セルには計算式が入っているため、編集した行以降も自動で数値が変わります。
      (B列、C列の計算式が消えている場合は適宜修正してください。)
      • B列のセル
        • 全てのNo.
          • 一行上のC列のセルの値+1 (現在B2の場合は"=C1+1")
      • C列のセル
        • No.1, 2, 4, 6, 8, 10, 12, 13
          • 同じ行のB列のセルの値+1,193 (現在C2の場合は"=B2+1193")
        • No.3, 5, 7, 9, 11
          • 同じ行のB列のセルの値+1,193+199 (現在C34の場合は"=B34+1193+199")
        • No.14
          • 同じ行のB列のセルの値+198 (現在C200の場合は"=B200+198")

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

(4) ovr指定後の確認

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

  • 全てのフレームの指定が完了していない場合は、(3)(4)を繰り返します。

  • 重複フレームの指定が誤っていたり、周期変化等により意図した結果ではない場合は、該当のCycleを修正します。

  • Cycleの途中で周期変化が起きた場合等には、ovrで読み込むファイルの直接編集が必要です。
    TDecimateの一覧とovrで読み込むファイルの該当箇所を比較しながら、"+","-"を適宜編集してください。

    Cycleの途中の周期変化に対応して編集する際の注意点

    • 25fpsIVTCforTDecimate.xlsx

      • B列のCycleグループの先頭フレーム番号は、必ず199の倍数を入力します。
        異なる番号を入力しても動作自体に支障はありませんが、TDecimateの一覧とずれてしまい、把握しづらくなりますので、おすすめしません。
      • 周期変化があるからと、D列を直接編集しないでください。
        Cycleを編集するのは、ovrで読み込むファイルです。
    • ovrで読み込むファイル

      • 一行に、"+"は166個、"-"は33個、合計199個で固定です。("Cycle=199"の場合)

        • 合計199個の範囲で"+","-"を異なる数で指定しても、フレームレートの維持を優先して、TDecimateに読み込み後に自動的に上記の数に調整されます。
          (TDecimateの一覧で確認できます。)
        • 合計が199個ではない場合は、その分フレーム番号の指定がずれて、意図しない出力結果となってしまいますのでご注意ください。
          (TDecimateの一覧で混乱できます。)
      • 特定の1Cycleのみ修正するために、該当のCycleを含むCycleグループの行を複製して、Cycleを分離する必要があります。

        例) Cycle(33432,33630)を編集するため、Cycleグループから分離

        • 分離前:
          • 32437,33630 +-+++++... Cycleグループ(6Cycle)の範囲指定
        • 分離後:
          • 32437,33431 +-+++++... 5Cycleに範囲変更
          • 33432,33630 +-+++++... 1Cycleに切り出したこの行を編集

        分離するのを忘れてそのまま編集してしまうと、そのCycleグループの全てのCycleに反映されてしまうため、注意しましょう。

    • 捕捉:ovrファイル内の記述
      ※詳細やその他の記述については、TDecimateのドキュメントを参照してください。

      • "+"は残すフレーム、"-"は間引くフレーム
      • 行頭"#",";"はコメントアウト行
      • フレーム範囲指定で"29850,0"のように"0"の指定は、最終フレーム番号の指定と同意

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

  • 最終確認
  • 全てのフレームが指定されており、漏れがないこと
    • エンコード後に確認したら意図しないフレームが間引かれていた、ということがないように、必ず全てのフレームが指定されていることを確認しましょう。

(5) 後工程

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

  • エンコードする際のTDecimateの設定は以下です。

    TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt")
    AssumeFPS(25,1)
    
    # これでも可
    # TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt",sdlim=-5)
    # TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt",sdlim=-5,display=false)
    # TDecimate(mode=0,CycleR=33,Cycle=199,ovr="c:\ovr\ovr.txt",sdlim=-5,display=false,displayOpt=6)
    
    
    • パス・ファイル名を環境に合わせて変更してください。
    • 本設定のTDecimateで出力すると、厳密には25fps(25/1)ではなく、25.0001255026381fps(4980000/199199)で出力されます。
      "AssumeFPS(25,1)"を指定することで、25fps(25/1)で出力することができます。
      • "AssumeFPS(25,1)"を指定することで、その手前までのFPS設定に関わらず、必ず25fps(25/1)で出力されることになるため、設定の誤りに気付きづらくなることにご注意ください。
    • sdlimは不要ですが、あっても問題ありません。
    • "display=true"を指定したままだと、エンコード後の再生画面にも一覧が表示されますので、ご注意ください。
    • "display=false"であれば問題ありません。
  • おまけ25.0001255026381fps(4980000/199199)25fps(25/1)へ変換する方法

    Amatsukazeやその他のエンコードアプリケーションで動画のみ変換する場合

    mkvmerge.exe -o outputfile --default-duration 0:25/1fps sourcefile
    

    その他のエンコードアプリケーションで動画と合わせて音声のピッチも変更する場合

    mkvmerge.exe -o outputfile --default-duration 0:25/1fps --sync 1:0,25.0001255026381/25 sourcefile
    

    ※要mkvtoolnix
    ※普段mkv形式を使用しており、mkv以外については調べていません。


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

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

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

  • 視聴に影響がないのであれば、そのまま放置するのが楽です。
  • 気になる方や間引き処理にこだわりたい方のための追加のガイドです。

◇方法1. フレームを削除・挿入する

お手軽且つ方法4.を超える新たな本命です。
基本フィルターですが、最近その存在に気付きました(!)。
Cycle内に重複フレームが34個以上ある場合は余剰分を強制的に削除し、33個に満たない場合は強制的に重複フレームを生み出すことができます。

  • フィルター
    • DeleteFrame(フレーム番号)…指定したフレームを削除する、","区切りで複数指定可
    • DuplicateFrame(フレーム番号)…指定したフレームを複製する、","区切りで複数指定可
  • 注意点
    • フレームの削除・挿入に伴い、後続のフレーム番号は、順次ずれることになります。
    • エンコードアプリケーション毎の注意点
      • Amatsukazeの場合
        動画の総時間の変更は許可されませんので、DeleteFrame()DuplicateFrame()の数を揃える等する必要があります。
      • その他のエンコードアプリケーションの場合
        音声も同時に編集される仕様の場合、フレームを削除・挿入した箇所の音声は、再生すると違和感がある可能性があります。

◇方法2. 周期を変える

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

  • ソース自体のTrim指定の先頭フレームの開始位置を前方に拡張
    • 変更前:Trim(30,78560)
    • 変更後:Trim(29,78560) ※1フレーム追加

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

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

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

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

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

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

  • フレームレート25fpsを維持するため、Cycle199の倍数(199*n)、CycleR33の倍数(33*n)で指定する必要があります。

  • Cycleに指定する値は、対象区間の総フレーム数を超えて指定することはできません。

    • 最終フレームまで含めてCycleに指定したいのに199の倍数にならない場合は、ソース自体のTrim指定を調整する必要があります。(例2.参照)
  • 指定する値の大きさに比例して、初回読み込みにとても時間が掛かるようになります。
    指定する値によっては5分以上掛かることもあるため、出力されるまで気長に待ちましょう。
    いざ出力されたあとは、Cycleに指定した範囲内は追加読み込みが発生することなく、Ctrl+Left/RightでCycleを切り替え可能です。(環境により異なるかもしれません)

  • Cycleに大きな値を指定する場合は、"displayDecimation=199"も追加指定してください。

    • パラメーターdisplayDecimationは、指定したフレーム数で一覧を分割して表示します。
      "displayDecimation=199"とすることで、Cycleに大きな値を設定した場合も、一覧を199フレーム毎に分けて表示することができます。
      ("Cycle=199"の一覧と同様に表示することができます。)
      • 一覧はCycleに指定したフレーム数を全て表示する仕様のため、Cycleに大きな値を指定して、displayDecimationの指定がない場合、一覧が画面に表示しきれず、確認作業ができませんのでご注意ください。
        また、displayDecimationの指定がない場合、Cycleに指定する値によっては、AvsPmodが強制的に終了してしまうことがあります。
        (私の環境では、displayDecimationを指定した場合は、Cycleに50,000程度まで指定しても、長い長い読み込み後に問題なく動作しています。)

      • displayDecimationを指定すると、一覧の上部に"#ofDecimations: x(y:z)"が追加表示されます。

        • x … 現在表示中の一覧の範囲内で実際に間引く対象としてマークした数("<<","**",">>"の合計数)を表示します。
        • y … CycleRに指定した間引き数の内、現在表示中の一覧のマーク(x)を含む、ここまでに間引く対象としてマークした数を表示します。
        • z … 間引く対象としてマークする残りの数を表示します。(CycleR=y+z)
      • displayDecimationは、2023.12.10 GMT+9にリリースされたバージョン(TIVTC v1.0.28/TDecimate v1.0.10)で追加されました!

例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
  • Trimで分割し、40596-40794と49750-79948を含めた2番目の"Trim(40596,49948)"に、"Cycle=9353"(199*47)と"CycleR=1551"(33*47)を指定することで、一つの大きな範囲として間引き処理を行います。
  • Cycle内の重複フレームの総数は33の倍数で変わらなくなるため、40596-40794の範囲の重複フレーム数は34、49750-79948の範囲の重複フレーム数は32、それぞれそのまま間引き処理が可能となります。

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

  • ソース自体のTrim指定を後方に拡張
    • 変更前:Trim(30,78560) ※Trim後のフレーム番号は0-78530
    • 変更後:Trim(30,78634) ※74フレーム追加、Trim後のフレーム番号は0-78604
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指定の範囲内に、追加で間引くフレームが見つからないため、敢えて不要なフレームを含めて、代わりに間引くことにします。
  • 78008を起点にすると、最終フレーム78530までのフレーム数は523で、199の倍数ではないため、199の倍数になるように、ソース自体のTrim指定を74フレーム分拡張します。
    (523+74=597=199*3)
  • 78008を起点とするTrimに"cycleR=99,cycle=597"と指定して、拡張した分の不要なフレームを含めることができるため、その中の適当な1フレームを代わりに間引きます。(74-1フレーム)
    • 狙ったフレームを間引くように、ovrで読み込むファイルを編集します。
  • 残った不要な73フレームは、25fpsへ変換後のフレーム番号で、追加のTrimを書けばカット可能かと思います。(上記コメントアウト部分)
    Amatsukaze使用の場合は、動画入力後の時間(長さ)の変更は許可されていないため、エンコード実施後に、TMPGEnc MPEG Smart Render等の動画編集アプリケーションでカット処理を行ってください。

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

  • フレーム番号はTrim分割でリセットされ、Trim毎にフレーム番号0から開始します。
    "Trim(0,78007)"…Trim後のフレーム番号は0-78007
    "Trim(78008,78604)"…Trim後のフレーム番号は0-596
  • ovrに読み込むファイルもTrim毎に分けて用意が必要となり、それぞれのフレーム番号は0から指定が必要です。
  • 特定のTrimの範囲のみ確認したい場合は、以下のように、他のTrimをコメントアウトします。
    # 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
    v2
    
    ※最後の"v2"(確認したいTrimの冒頭の文字列)を忘れると、期待する表示になりません。
    ※確認後に元に戻すことを忘れないでください。

6. 最後に(謝辞)

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

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


改訂履歴

  • 2024.11.28 v2.0

    • 改訂履歴の行番号をエディター方式に変更
    • タイトルにバージョン番号を追加 (1)
    • 英語版(Google翻訳)のリンクを追加 (3)
    • 改訂履歴へのアンカーリンクを追加 (6)
    • プラグインの最新バージョンを更新 (177,178)
    • 後工程に"AssumeFPS(25,1)"を追加 (357,366-368,373-386)
    • 「5. Cycle内の~」に新たに方法1.を追加(後続の番号は繰り上げ) (401-416)
  • 2023.12.23 v1.1

    • 「捕捉:Trimで分割する場合の注意」加筆(460-472)
  • 2023.12.21 v1.0

    • 初版公開

権利情報

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

This work is licensed under CC BY 4.0