2012/04/28

続・TDFM2EVFR的な何か

TDFM2EVFR的な何か
Loggia Logic

というわけで、自動でCMカットしてくれる素敵すぎるS/W、logoGuilloに対応してみました。
具体的にはlogoGuilloからTrimコマンドを受け取ってfps判定を含めて適当に加工して、出力しなおす、というスクリプトになりました。
この怪しいサイト構成を見ればわかっていただけるかと思いますが、用途としては24fpsでベタヌリな感じのもの以外は想定していません。

特徴としてはCMの頭出し検索をやるため、名探偵コナンのようにOP(ロゴあり)→提供(ロゴなし)と画面が続いている場合も切れづらい、というぐらいです。
理屈としては本編→CMは誤判定があっても、CM→本編の誤判定は少ないだろうという推定のもと、CM→本編となった時から遡って15s毎にシーンチェンジ検出を行い、15s単位でシーンチェンジがある範囲を探す、というようなところです。
一応fpsによる判定もついてますが、調査サンプルが少ないためいまいち効果は不明です。

それにしても昔自分で作ったスクリプトを今見直すと全部作り直したくなるのはどうしたものか。
やっぱりスパゲッティはいかんですね・・・。時間がないのでやりませんが。

とりあえずはこれで自動CMカット、自動VFRなことができます。
が、それをやりたいのならAutoVFRでいいんじゃないかとも思う今日この頃です。
実はちゃんと使ったことがないのでよくわかりませんが、AutoVFRはマニュアルプルダウンを目的に作ってるそうなので、楽に適当なファイルを作成したい僕の目的とは多少異なるかも?
まぁ、おいおい時間があれば使ってみたいところです。

TDFM2EVFR ダウンロード

あくまで自分で使うように作ったスクリプトなので、特殊な仕様が多々あります。
汎用品ではないので、各自の環境に合わせてお使いください。
出力結果には一切責任を持ちませんのでだまされたときはあきらめてください(汗

そして、referをblogspot.comだけにしていたためにblogspot.jpからアクセスしてくださった方々はダウンロードできない状態だったということに今気が付きました。
申し訳ない・・・。

更新履歴
120512 trim区間に「-1」を出力することがあったのを修正
120505 基本的にはfps判定アルゴリズムの見直し いろいろやったので記憶がない しばらくはこれで行く・・・予定
120501 デバッグ用のコードが入ったままで正常出力できていなかった(汗のを修正
120429 長さを一定以上にする処理の一部にバグがあったので修正
120428
・logoGuilloの出力を受け取って以下の処理をする
1.CMの頭出し検索
2.1の結果をもとにtrimコマンド、chapters.txt出力
・その他もろもろ






参考例

某バーローなアニメで、logoguilloの出力がこんな感じだとします(logoguillo.txt)
Trim(11,4086) ++ Trim(7234,24315) ++ Trim(27913,49759) ++ Trim(50210,51227)
これと
TDecimateのログTDmetrics.txt
#TDecimate v1.0.3 by tritical
crc32 = d94fc3af, blockx = 32, blocky = 32, chroma = T
0 0 0
1 0 0
2 0 0
3 26447 4754960
4 23915 4578726
5 24192 4238603
6 22463 4102922
7 20411 3941993



TFMのログTFMout.txt
#TFM v1.0.4 by tritical
field = top
crc32 = 63b95628
0 c - [16]
1 c - [16]
2 c - [16]
3 c - [17]
4 c - [22]
5 c - [21]
6 c - [29]


を用意して、
perl TDFM2EVFR.pl "TFMout.txt" "TDmetrics.txt" "logoguillo.txt" >"hoge_TDFM2EVFR.avs"
とやると、

hoge_TDFM2EVFR.avsにこんなのが出力される
v001=Trim( 10, 4535).VFR24() # 150.984s
v002=Trim( 7234, 24316).VFR24() # 569.969s
v003=Trim( 27913, 49759).VFR24() # 728.928s
v004=Trim( 50210, 51109).VFR24() # 29.997s
v005=Trim( 51110, 51227).VFR60() # 3.904s

all=EasyVFR_Create(v001,timecode)
all=all.EasyVFR_Append(v002,timecode)
all=all.EasyVFR_Append(v003,timecode)
all=all.EasyVFR_Append(v004,timecode)
all=all.EasyVFR_Append(v005,timecode)
all

# CM section
# 0 9 0.300s
# 4536 7233 89.990s
# 24317 27912 119.953s
# 49760 50209 14.982s
# 51228 51243 0.500s
因みに、この作品では次回予告の直後に丁度15秒間提供画面(ロゴなし)が表示されるためその部分(49760-50209)が切れています。
再生した感じではあったことには気づきませんし、仕様なのであきらめも必要です。

fps判定結果の例
某Nitro+な魔法少女の最終話(3話分)一部本編の前に他番組の宣伝(ロゴ有り)が入っているため、その部分も入っています。
(22997-23895, 79401-80299とか)その辺はある程度30fpsと判定しているハズ。
文字が上下に流れるED(44607-46456,150133-152824)やテロ(・・・はなかったかな)の部分は60fpsっぽく判定しているハズ。
112918-113085の30fpsは本編が静止画、+提供テロップにクロスカラーありという状態だったため30fpsになってます。気にしない。
134665-135650も他番組の宣伝ですが、直後の本編が静止画から始まるためその部分まで30fpsで判定しています。が、静止画なので再生する分には気にならないでしょう、という仕様であきらめました。
Logoguilloの出力
Trim(10,20298) ++ Trim(22997,46912) ++ Trim(49311,50358) ++ Trim(53956,76702) ++ Trim(79401,100558) ++ Trim(103257,104304) ++ Trim(107902,131966) ++ Trim(134665,154504) ++ Trim(157203,158235)

スクリプトの出力
v001=Trim( 10, 675).VFR24() # 22.189s
v002=Trim( 676, 952).VFR30() # 9.209s
v003=Trim( 953, 20299).VFR24() # 645.512s
v004=Trim( 22997, 23895).VFR30() # 29.963s
v005=Trim( 23896, 44606).VFR24() # 691.024s
v006=Trim( 44607, 46456).VFR60() # 61.695s
v007=Trim( 46457, 47062).VFR24() # 20.187s
v008=Trim( 49311, 50359).VFR24() # 34.968s
v009=Trim( 53956, 76703).VFR24() # 758.992s
v010=Trim( 79401, 80318).VFR30() # 30.597s
v011=Trim( 80319,100558).VFR24() # 675.308s
v012=Trim(103256,104305).VFR24() # 35.002s
v013=Trim(107902,112917).VFR24() # 167.334s
v014=Trim(112918,113085).VFR30() # 5.572s
v015=Trim(113086,131967).VFR24() # 629.996s
v016=Trim(134665,135650).VFR30() # 32.866s
v017=Trim(135651,150132).VFR24() # 483.183s
v018=Trim(150133,152824).VFR60() # 89.790s
v019=Trim(152825,154954).VFR24() # 71.038s
v020=Trim(157203,158235).VFR24() # 34.434s

all=EasyVFR_Create(v001,timecode)
all=all.EasyVFR_Append(v002,timecode)
all=all.EasyVFR_Append(v003,timecode)
all=all.EasyVFR_Append(v004,timecode)
all=all.EasyVFR_Append(v005,timecode)
all=all.EasyVFR_Append(v006,timecode)
all=all.EasyVFR_Append(v007,timecode)
all=all.EasyVFR_Append(v008,timecode)
all=all.EasyVFR_Append(v009,timecode)
all=all.EasyVFR_Append(v010,timecode)
all=all.EasyVFR_Append(v011,timecode)
all=all.EasyVFR_Append(v012,timecode)
all=all.EasyVFR_Append(v013,timecode)
all=all.EasyVFR_Append(v014,timecode)
all=all.EasyVFR_Append(v015,timecode)
all=all.EasyVFR_Append(v016,timecode)
all=all.EasyVFR_Append(v017,timecode)
all=all.EasyVFR_Append(v018,timecode)
all=all.EasyVFR_Append(v019,timecode)
all=all.EasyVFR_Append(v020,timecode)
all

# CM section
# 0 9 0.300s
# 20300 22996 89.957s
# 47063 49310 74.975s
# 50360 53955 119.953s
# 76704 79400 89.957s
# 100559 103255 89.957s
# 104306 107901 119.953s
# 131968 134664 89.957s
# 154955 157202 74.975s

#

ついでに、samplesフォルダ内のファイルについては多分に僕の妄想が入っているので気にしないでください。

0 件のコメント:

コメントを投稿