スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Auto_VFR_Fastについて

Auto_VFR_FastはDoubleWeaveしたクリップを1/6に間引いてから解析しています。



上図は元クリップをDoubleWeaveした後の状態です。
24fpsではいずれのパターンにおいても、黄色いフレームが5回連続で縞が続くことは無いことが分かります。
これによって24fpsか30(60)fpsかの区別をしています。

逆に言うとこれより短いフレーム数では24fpsと30fps以上との区別をする材料として足りないため、
フレームレートの変更を正確に捕捉できない可能性があります。

つまりAuto_VFR_Fastは細かくフレームレートが変わるような作品には向いておらず、
実質的にテロップ処理専用と考えて使うのがよさそうです。

スポンサーサイト

Auto_VFR ver 0.1.0.6

Auto_VFR.avs
Auto_VFR_Fast.avs

分割に関するパラメータを変更しました。

【変更点】
① "start","total","middle"パラメータの廃止
② "cut", "number" パラメータの追加
③ Auto_VFR_Fastも分割に対応(②のパラメータを追加)


【syntax(追加分)】
Auto_VFR(int "cut",int "number")
Auto_VFR_Fast(int "cut",int "number")

"cut" =ログの分割数を入力します。
"number" =分割ログの中の何番目かを入力します。

//------------------------------------------------------------------------

前バージョンまでの分割方法ではいろいろ面倒だったので、関数内で自動的に均等なフレーム数に
分割する仕様に変更しました。
なお分割解析しない場合はこれらのパラメータは設定しないか、またはcut=1,number=1にしておいてください。


●4分割してログを作成する例

まず設定を記述するヘッダーとなるavsを作ります。
/*-----------------------------------header.avs-----------------------------------*/
#入力ソース
video_file="test.d2v"

#トリム
str_trim="Trim(27,5239)++Trim(7039,25350)++Trim(27149,46178)++Trim(47978,48577)"

#分割数
cut=4

#Auto_Vfr_Fastを使う場合はtrueにしてください
IsFast=false

#ソース読込&CMカット
MPEG2Source(video_file)
Eval(str_trim)

#return lastは書かない
/*----------------------------------- ここまで-----------------------------------*/


そして同じフォルダに以下の4つのavsを置きます。
/*----------------------------------- av1.avs-----------------------------------*/
Import("header.avs")
(!IsFast)?Auto_VFR("log1.txt",cut=cut,number=1)
\:Auto_VFR_Fast("log1.txt",cut=cut,number=1)
return last
/*----------------------------------- av2.avs-----------------------------------*/
Import("header.avs")
(!IsFast)?Auto_VFR("log2.txt",cut=cut,number=2)
\:Auto_VFR_Fast("log2.txt",cut=cut,number=2)
return last
/*----------------------------------- av3.avs-----------------------------------*/
Import("header.avs")
(!IsFast)?Auto_VFR("log3.txt",cut=cut,number=3)
\:Auto_VFR_Fast("log3.txt",cut=cut,number=3)
return last
/*----------------------------------- av4.avs-----------------------------------*/
Import("header.avs")
(!IsFast)?Auto_VFR("log4.txt",cut=cut,number=4)
\:Auto_VFR_Fast("log4.txt",cut=cut,number=4)
return last


以下のバッチファイルで4つのavsを同時に実行できます。
最後に結合したログ"log.txt"が出力されて完成です。

Set x264="x264.exe"
Set analyze=--preset ultrafast --tune fastdecode --merange 4 --ref 0 --no-psy --bitrate 1 --output NUL

Set avs1="av1.avs"
Set avs2="av2.avs"
Set avs3="av3.avs"
Set avs4="av4.avs"

%x264% %analyze% %avs1% | %x264% %analyze% %avs2% | %x264% %analyze% %avs3% | %x264% %analyze% %avs4%

Set log1="log1.txt"
Set log2="log2.txt"
Set log3="log3.txt"
Set log4="log4.txt"
Set log="log.txt"

copy %log1% + %log2% + %log3% + %log4% %log%

//------------------------------------------------------------------------

上記の例では4分割していますが、Trimの個数に縛られなくなったので、CPUとメモリが許す限り
分割数は自由に設定できます。
とりあえず8スレッドなら6分割くらい、12スレッドなら8分割くらいが妥当なんじゃないかと思います。


//------------------------------------------------------------------------
Auto_VFR_FastだけGUI化してみました。
AVF_GUI

Auto_VFR通常版ほど高機能ではありませんが非常に高速なので、テロップ位置を探すためだけの
ツールとして使ってもいいかもしれません。


AutoVfr.exe ver0.1.1.1

確定申告も終わったので久しぶりに本体の更新。
Download

変更点
・-INIコマンドの追加
 設定ファイルのパスと名前を指定できるようにした。
 指定しない場合は従来通り"AutoVfr.ini"。
 作品ごとにiniの中身を書き換えたりするのが面倒だったので、あらかじめ
 複数用意できるようにした。

・設定ファイル内に"Mode_6to2"の追加
 ItsだとFunc_6to2で設定した関数のfpsが[24]に固定されてしまっていたので
 変更できるようにした。
 例えば周期情報を必要とする60fps関数などの自動設定ができるようになった。


/*---周期情報を必要とする60fps関数の例---*/
HybridBob.avs
<解説>
画面下(または上)のテロップ部分だけbobing関数(例ではQTGMC)で60fps化、それ以外の
部分はマニュアル解除で24fps化したフレームを60枚に水増ししている(例の書き方だと最初と
最後のフレームだけ普通のbobフレームを使用する場合があり、使えるのは5の倍数フレーム数限定)。
利点として
・処理速度の高速化
・bobing特有の画質の問題が生じるのを防げる(かも)

AutoVfrで使う場合は設定ファイルに
Func_6to2 =HybridBob(int_ref,txt_area=280,top=false)
Mode_6to2 =60
という具合に書いておけば、周期が判別できた場合はHybridBobを使い
できなかった場合は普通の60fps関数を使うようにできます。

Auto_VFR ver 0.1.0.5

Auto_VFR.avs
(ver 0.1.0.6)を使用してください。

ログ作成スクリプトのみの更新です。変更点は以下です。

(1)ソース解像度がSD時のデフォルト値の変更
(2)分割解析に対応("start","total","middle"パラメータの追加)

解析のスレッド使用率がなかなか上がらないので、分割解析できるようにしてみました。
CPU次第ですが2つ同時解析くらいならほとんど速度が落ちないので有効な方法だと思います。



//---------- 記述例 ----------//
[avsファイルの例]
MPEG2Source(video_file)

#CMカットの文字列を貼り付ける
str_trim="Trim(32,5964)++Trim(7764,23377)++Trim(25177,46334)++Trim(48134,48582)"

#TrimSelectはblog-entry-6.htmlを参照。面倒でなければ直接Trimを分割してもいいです。
clip1=Eval(TrimSelect(str_trim,1))++Eval(TrimSelect(str_trim,2))
clip2=Eval(TrimSelect(str_trim,3))++Eval(TrimSelect(str_trim,4))
fc1=clip1.framecount
fc2=fc1+clip2.framecount

clip1.Auto_VFR("log1.txt",total=fc2,middle=true) #1番目
#~ clip2.Auto_VFR("log2.txt",start=fc1) #2番目(まだコメントアウトしておく)
return last

[batファイルの例]
%x264% --preset ultrafast --tune fastdecode --bitrate 0 --output NUL %1

//---------- 使い方 ----------//
(1)上記のavsをbatファイルにドロップすると前半部分の解析が始まります。
(2)avsの#1番目をコメントアウトし、#2番目のコメントアウトを解除してavsを保存したら
 同じbatファイルにドロップすると後半部分の解析が始まります。
(3)2つとも解析が終わったら、以下のbatファイルでログファイルを結合させて完成です。

 copy log1.txt + log2.txt log.txt

//---------- 解説 ----------//
分割解析をするのに使うパラメータは以下の3つです。
total    ・・・・1番先頭のカットのみ指定します。全てのカットの総フレーム数を指定します。
start    ・・・・2番目以降のカットで指定します。解析開始位置のフレームを指定します。
middle   ・・・・最後以外のカットには"middle=true"を指定しておきます。

分割部分を強制的にシーンチェンジ扱いにするので、通しで解析した場合と若干結果が
異なる場合がありますが、CMカットで分割するなら問題ないと思います。
自分で分割位置を決める場合は、縞を挟まずにシーンチェンジしている箇所で分割すれば
通しで解析した時と同じ結果が得られるはずです。
ちなみに今回は5の倍数とかは気にしなくていいです。


最後に4分割で解析する場合の例も書いておきます。
[avs]
MPEG2Source(video_file)
str_trim="Trim(32,5964)++Trim(7764,23377)++Trim(25177,46334)++Trim(48134,48582)"

clip1=Eval(TrimSelect(str_trim,1)).TBSCrop() #アバンかAパートに豚が現れる場合は消しておく
clip2=Eval(TrimSelect(str_trim,2)).TBSCrop()
clip3=Eval(TrimSelect(str_trim,3))
clip4=Eval(TrimSelect(str_trim,4))
fc1=clip1.framecount
fc2=fc1+clip2.framecount
fc3=fc2+clip3.framecount
fc4=fc3+clip4.framecount

clip1.Auto_VFR("\log1.txt",total=fc4,middle=true) #1番目
#~ clip2.Auto_VFR("log2.txt",start=fc1,middle=true) #2番目
#~ clip3.Auto_VFR("log3.txt",start=fc2,middle=true) #3番目
#~ clip4.Auto_VFR("log4.txt",start=fc3) #4番目
return last

[bat]
copy log1.txt + log2.txt + log3.txt + log4.txt log.txt



メモ8

/*---AutoVfr.exe ver0.1.1.0---*/
Download

簡易解析モードを追加しました。
機能的には下記のように制限されますが、解析フレーム数が通常版の1/6になります。

 ・機能は24/60fps、または24/30fpsの分割のみ。
 ・AutoVfr.iniで指定した関数のみ使用される。

簡単に言うとテロップ処理とかだけできればいいやという人向けです。


※avs例
 MPEG2Source("video_file")
 Trim()#CMカット
 Auto_VFR_Fast("log_file")
 return last

※コマンド例
 AutoVfr.exe -i "log_file" -o "output.def" -ref 150 -30f 1 -60f 1 -fix 0

Auto_VFR_Fastで作成したログを入力すると自動的にFast-Modeになります。
この時、-REF は非24fps区間の最小フレーム数を指定するコマンドとして
使われます(最小30 / 15フレーム単位)



メモ7

/*---ログを作成する関数Auto_VFR---*/
今さらですが書いたことが無かった気がするので。
ソースの状態が悪い場合は縞判定オプションを変更してみてください。

function Auto_VFR(
  \clip c,
  /*--- 出力ファイルパス ---*/
  \string file,    #ログのパス名

  /*--- 縞判定に関する設定 ---*/
  #各オプションの説明はTIVTCの"ShowCombedTIVTC - READ ME.txt"を参照
  \int "cthresh"
  \,int "mi"
  \,bool "chroma"
  \,int "blockx"
  \,int "blocky"

  /*--- IsCropに関する設定 (-REFコマンドを使う場合、使うと精度が上がります)---*/
  \,bool "IsCrop"      #通常のログと画面一部をCropしたログを同時に採ります(default"false")
  \,int "crop_height"    #クロップの高さ(default c.height-(16*50))
  \,bool "IsTop"       #画面上部をクロップします(default"false")
  \,bool "IsBottom"     #画面下部をクロップします(default"true")
  \,bool "show_crop"    #クロップされてる状態を確認します(default"false")

  /*--- IsDupに関する設定 (-DUPコマンドを使う場合必要です)---*/
  \,bool "IsDup"      #通常のログとモーション検出のログを同時に取ります(default"false")
  \,int "thr_m"       #(default 10)
  \,float "thr_luma"    #(default 0.010)
\)

メモ6

/*---ログを作成する関数Auto_VFRと、AutoVfr.exeのコマンドの基本例---*/
-SKIPは周期が細かく変更される作品ではない限り、1以上が良いと思います。

※24fpsのみ
 Auto_VFR("log.txt")
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 1 -FIX 0 -30F 0 -60F 0]
//------------------------------------------------------------------

※自動関数のみ
 Auto_VFR("log.txt")
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 1 -FIX 0 -24A 1 -30A 1]
//------------------------------------------------------------------

※TBSアニメ
 TBSCrop().Auto_VFR("log.txt")
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 1 -FIX 0]
//------------------------------------------------------------------

※アプコンアニメ
 Auto_VFR("log.txt",cthresh=12,blocky=8)
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 0 -FIX 0]
//------------------------------------------------------------------

※テロップの24fps化関数を使う場合
 ・下テロップ
 Auto_VFR("log.txt",IsCrop=true,crop_height=256)
 ・上テロップ
 Auto_VFR("log.txt",IsCrop=true,crop_height=256,IsTop=true,IsBottom=false)
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 1 -FIX 0 -REF 150]
//------------------------------------------------------------------

※12fps以下のfpsを使う場合
 Auto_VFR("log.txt",IsDup=true)
 [AutoVfr.exe -i "log.txt" -o "a.def" -SKIP 0 -FIX 0 -DUP 1]

メモ5

/*---基本的な解除方法3---*/
その他24fpsで使用されるのは以下の5つです。
SelectEvery(5,0,1,2,3) -Itsでは(10,0,2,4,6)
SelectEvery(5,0,1,2,4) -Itsでは(10,0,2,4,8)
SelectEvery(5,0,1,3,4) -Itsでは(10,0,2,6,8)
SelectEvery(5,0,2,3,4) -Itsでは(10,0,4,6,8)
SelectEvery(5,1,2,3,4) -Itsでは(10,2,4,6,8)

これらを判定処理に使うと、30pを24pと誤認したり、或いは24pであっても
フレームを飛ばしてしまうなどのおそれがあります。
よって判定自体はまずPullDown(0,2)~(2,4)の5種で行い、その区間を
それぞれ対応する上記関数に置き換えられるかどうか判断し、スキップ数が
少ない等の条件が揃えばPullDownの代わりにたまに使用されます。

動きがほとんど無いシーンなどでは周期に関係なく唐突に使われる事もあります。


/*---基本的な解除方法4---*/
30fpsは以下の2種類があります。
無し -Itsでは<10>
Doubleweave.SelectOdd -Itsでは<01>

Oddはコマンドで"-Odd 1"と入れると使用されるようになりますが、
基本的に使われる事はあまり無いと思います。
TBSの豚が現れた時に背景の絵が全く動いていなければ、もしかすると
使用されるかもしれません。

アニメにおいてはシーン周期自体に30pがある作品以外では30fps自体
オフにしておいた方が無難かもしれません。
例えばテロップが30pであった場合に厄介な事になると思います。

メモ4

/*---5の倍数フレーム数でカットする仕様に関して---*/
30fpsのベースクリップを24fps化した場合、フレーム数が5の倍数でないと
いろいろと問題が発生します。
特に問題なるのが表示時間の変化が起きることです。
この点に関してあまり厳密では無いかもしれませんが平易にまとめてみます。
//------------------------------------------------------------------
例えば「5フレーム@30fps」のクリップがあったとします。
このクリップの表示時間は5/30秒(20/120秒)です。
このクリップを24fps化すると、どんな24fps関数でも4フレームになります。
表示時間は4/24秒(20/120秒)となり、変化は起きません。
//------------------------------------------------------------------
では「6フレーム@30fps」(表示時間:24/120秒)を24fps化するとどうなるか?
これは関数の処理内容によるのですが、多くの関数の場合4フレームになります。
表示時間は先程と同じ4/24秒(20/120秒)です。

ここで二つの問題が生じています。
・間引き判定とは無関係に1フレームがドロップしてしまった。
・表示時間が4/120秒短くなってしまった。

5の倍数でない30fpsクリップを24fps化すると、しばしばこの間引き判定とは
無関係なドロップが発生します。
これはCMカットだけの分割ではほとんど問題になりませんが、細いスパンで
分割を行う場合は無視できなくなるかもしれません。
//------------------------------------------------------------------
では「6フレーム@30fps」を"DoubleWeave.PullDown(0,2)"で24fps化した場合は?
この場合、今度は5フレームになります。
ドロップこそ起きていませんが、表示時間は5/24秒=25/120秒となり、今度は
元クリップよりも長くなってしまいました。

これらの事からドロップの有無に関係なく、元クリップとの表示時間の齟齬は
必ず生じてしまう事が分かります。
//------------------------------------------------------------------
これを調整するのがいわゆる終端補正と呼ばれる処理です。
簡単に言うとカットの最終フレームの表示時間を歪めることで全体の表示時間の
長さの帳尻を合わせています。
//------------------------------------------------------------------
AutoVfrでは仕様上どうしても多分割になることが多く、終端補正の多用も避けた方が
無難と考え、最終カット以外は必ず5の倍数(又はそれと同等の戻りフレーム数に調整)の
フレーム数で分割します。


※よくアニメのエンコサイトとかで見かけるavsの書き方について
tr1=13696
tr2=23975
tr3=43754
tr4=44052
Trim(0,tr1-1).DoubleWeave().SelectEvery(5,0,2) ++ \
Trim(tr1,tr2-1).DoubleWeave().SelectEvery(5,0,2) ++ \
Trim(tr2,tr3-1).DoubleWeave().SelectEvery(5,1,3) ++ \
Trim(tr3,tr4).DoubleWeave().SelectEvery(5,0,2)

この書き方の場合、上述した理由から微妙に問題が生じている事が分かります。
全てのカットが5の倍数で無いとすると、4カット目に辿り着くまでに最大0.1秒程度
表示時間がズレる事があります。
たとえ24fps関数しか使っていなくても、この場合は終端補正を入れてVFR化した方が無難です。

メモ3

/*---frame_refの自動指定---*/
これはivtc_txt60mc(http://forum.doom9.org/showpost.php?p=1466105&postcount=4)
という関数のための機能です。

この関数は60iテロップのあるシーンを24fpsにしてもテキストの移動量が一定になるようにします。
この関数を使うには3-2プルダウン周期のはじまる最初のフレーム番号を指定しなければ
いけませんが、AutoVfrでは以下の2つの方法でこれを自動指定します。

①関数Auto_VFR(IsCrop=true)でログを作成する。
通常クリップのログに加えて、画面の下(または上)部分をクロップしたクリップの
2つのクリップの縞検出ログを同時に作成します。
マニュアル解除が可能な範囲では通常のログしか使いませんが、それが不可能な範囲では
クロップされた側のクロップを読んで周期の判別を試みます。

クロップの高さはcrop_heightで指定できます。
default値の決め方は今思うとあんまりよろしくないので、
Auto_VFR(IsCrop=true,crop_height=256)
とか、ちゃんと明示しておいた方が良いかもしれません。
show_crop=trueでテロップが全部隠れてるかどうかも場合によっては確認が必要です。

※IsCropに関連するパラメータのdefault値
Auto_VFR(IsCrop=false,crop_height=height-(16*50),IsTop=false,IsBottom=true,show_crop=false)

AutoVfr.exeでは -REF 1またはそれ以上の数を指定した場合、このクロップされたログを
使ってframe_refの自動指定を試みます。

②前後区間から推測する。
AutoVfr.exeで -REF 5以上(5フレーム間隔なので)の数を指定した場合、①に加えて
前後のTrimの周期からframe_refを推測して適用します。
例えば-REF 150なら150フレーム以上のテロップシーン(と推察される範囲)に適用されます。

全て推測でかまわない場合はクロップされたログは必要無い事になります。
推測だけでもそう簡単に間違えるようにはなっていないつもりですが、周期不定の場合は
テロップの最中に周期変更が生じている可能性も否定できないので絶対とは言えません。

プロフィール

Author:putin
ロゴ関係ソース

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
メールフォーム

名前:
メール:
件名:
本文:

リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。