スポンサーサイト

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

「それ、T●Sがやります」

Auto_VFRのログが荒れて非常に邪魔なので、解析中は黒く塗りつぶすなどして隠しておきたいところです。

以前の豚くん用に作った"TBSCrop()"のパラメータを変えて対応してもいいのですが、
全フレームに渡って広い範囲を覆い隠すのは縞判定に影響を与えないか不安な気がします。

そこで内蔵フィルタの"FreezeFrame"を改良して、source_frameをサイズ指定しながら
フレームを差し替えられるようにして対応してみます。

FreezeFrame2.avsi
function FreezeFrame2(clip c
\,int "first_frame", int "last_frame",int "source_frame"
\,int "left",int "top",int "right",int "bottom"
\,int "x",int "y"
\,bool "show")


#Aパート冒頭に「それT●Sがやります」が現れる場合の解析用avsの例
/*-------------------------------------------------------------------
MPEG2Source("d2v")
str="Trim(42,3037)++Trim(4837,20629)++Trim(22429,46494)++Trim(49192,50390)"

v01=Eval(TrimSelect(str,1))
v02=Eval(TrimSelect(str,2)).FreezeFrame2(0,240,-2,left=960,top=0,right=0,bottom=740,show=false)
v03=Eval(TrimSelect(str,3))
v04=Eval(TrimSelect(str,4))
all=v01++v02++v03++v04
all

Auto_VFR("log.txt")
/*-------------------------------------------------------------------

freezeframe

"source_frame=-2"で黒く塗りつぶせるようにしました(-1だと0フレーム目指定なので)。

「それT●Sがやります」はだいたい210フレーム以内に消えると思いますが、とりあえず余裕を取って
0~240フレームまで黒く塗りつぶしています。
source_frameのサイズはなるべく4の倍数が良いかもしれません。

スポンサーサイト

Eval()

前回の記事で使用したスクリプト集は"WriteChapter"以外は全て、クリップを全く返さない
文字列を操作するだけの関数なので、実際のクリップには何の変化も与えていません。

文字列のトリムを実際に実行するにはAvisynth内蔵関数の"Eval()"を使います。

試しにOPのシーンだけのクリップを抜き出してみます。

#CMカット(の文字列)
str="Trim(29,5482)++Trim(7282,23553)++Trim(25353,46332)++Trim(49030,50377)"
#1個目のトリムから提供を分離
str=TrimSplit(str,1,300,back=true)
#1個目のトリムからOPを分離
str=TrimSplit(str,1,2700,back=true)
この時点で2個目のトリムがOPという事になります。
#2個目のトリムを選択(トリムを実行)
Eval(TrimSelect(str,2))

これで(だいたい)OPのシーンを抜き出せていると思います。

もちろんトリムだけではなく他の関数も実行する事ができます。
例えば
str="Spline36Resize(1280,720)"
Eval(str)
と書けばリサイズを実行する事ができます。
何の役に立つか分かりませんが、まぁとにかくそういう書き方もできるという話です。


[12/06/17更新]

●文字列のトリムでCMカット・ロゴ処理・チャプター作成までを行うスクリプトの例
/*-------------------------------------------------------------------*/
MPEG2Source("d2v")

#CMカット(この時点では文字列を設定したのみで実行してない)
str="Trim(29,5482)++Trim(7282,23553)++Trim(25353,46481)++Trim(49179,50377)"

#Trimの個数を数えておく

count=TrimCount(str)

#ロゴ処理(Evalでトリムを実行し、各トリムごとにロゴ処理を施す)
logo_file="TBS.lgd"
v01=Eval(TrimSelect(str,1)).DeLogo(logo_file,start=6,fadein=8,fadeout=8,end=7)
v02=Eval(TrimSelect(str,2)).DeLogo(logo_file,start=6,fadein=8,fadeout=8,end=7)
v03=Eval(TrimSelect(str,3)).DeLogo(logo_file,start=6,fadein=8,fadeout=8,end=7)
v04=(count>3)?Eval(TrimSelect(str,4)).DeLogo(logo_file,start=6,fadein=8,fadeout=8,end=7):v03
v05=(count>4)?Eval(TrimSelect(str,5)).DeLogo(logo_file,start=6,fadein=8,fadeout=8,end=7):v04

#trimの個数に応じて結合
all=(count==3)?v01++v02++v03
\:(count==4)?v01++v02++v03++v04
\:v01++v02++v03++v04++v05

all

/*------------チャプター作成------------*/
chap=TrimClean(str)

# 1個目のTrimが[アバン + OP +提供]以上の長さがある場合はOPで分割
chap=(v01.framecount>3020)? TrimSplit(chap,1,3000,back=True) : chap

# 最後から2番目のTrimをEDの長さで分割
chap=TrimSplit(chap,TrimCount(chap)-1,2700,back=True)

# 1個目のTrimの長さによってパート編成を選択
part=(v01.framecount>3020)?"avant,op,a-part,b-part,ed,next"
\:(v01.framecount>2980)?"op,a-part,b-part,ed,next"
\:"avant,a-part,b-part,ed,next"
#※1個目のTrimの長さが3020より長いならアバン&OP、ほぼ3000くらいならOPのみ、
# 2980より少ないならアバンのみと判定させています。



# チャプターファイルの出力

WriteChapter(chap,"chapter.txt",part,fps=framerate)


return last

#EraseLOGOの"end"を後ろから何フレーム目かの表記に換えただけの関数
function DeLogo(clip c,string logofile,int "start",int "fadein",int "fadeout",int "end"
\,int "depth",bool "interlaced")
{
start=default(start, 0)
fadein=default(fadein, 0)
fadeout=default(fadeout, 0)
end=default(end, 0)
depth=default(depth,128)
interlaced=default(interlaced, true)
_end=c.FrameCount()-end-1
return EraseLOGO(c,logofile=logofile,pos_x=0,pos_y=0,depth=depth,yc_y=0,yc_u=0,yc_v=0
\,start=start,fadein=fadein, fadeout=fadeout,end=_end,interlaced=interlaced)
}
/*-------------------------------------------------------------------*/

ロゴのフェードなどは微調整が必要な場合がありますが、Aviutlなどでエクスポートしたトリムを
最初にそのまま貼るだけで、ロゴ処理とチャプター作成が(だいたい)できるので便利ではないかと思います。

TVアニメで自動的にチャプターファイルを作成する方法

以前に文字列のTrimを編集する関数集としてここにメモったのですが、
実は本当はチャプターファイルを作る事を主旨として書いたスクリプトだったので、
簡易的にチャプターファイルを作成する方法として改めて紹介してみます。
TrimClean

/*------------チャプターファイル作成例------------*/
①まずCMカットで作ったTrimを文字列として貼り付けます。
str="Trim(29,5482)++Trim(7282,23553)++Trim(25353,46332)++Trim(49030,50377)"
↑のような4分割のトリムで、番組の編成が
【アバン・OP・提供】,【Aパート】, 【Bパート・ED】,【次回予告・提供・EC】
だったとします。
これを
【アバン】,【OP・提供】,【Aパート】,【Bパート】,【ED】,【次回予告・提供】,【EC】
に分割していきたいと思います。


②トリムを0から始まる連結した数字に書き直します(お約束として必ず書きます)。
str=TrimClean(str)
※"str"の中身がどう変わったかは以下の関数で確認できます。
subtitle(str)


③1番目のトリム【アバン・OP・提供】を,後ろから3000フレームで分割(アバンとOPを分離)
str=TrimSplit(str,1,3000,back=true)

④最後から2番目のトリム【Bパート・ED】を,後ろから2700フレームで分割(BパートとEDを分離)
str=TrimSplit(str,TrimCount(str)-1,2700,back=true)

⑤最後のトリム【次回予告・提供】を,後ろから150フレームで分割(提供とECを分離)
str=TrimSplit(str,TrimCount(str),150,back=true)
ここまででもう一度 subtitle(str) でトリムの状態を確認してみましょう。
7つに分割できていると思います。


⑥各トリムの先頭にチャプタ名を打っていき、チャプターファイルを出力する関数。
WriteChapter(str,"chapter.txt","Avant,OP,A-part,B-part,ED,Next,EC",fps=framerate)
※プレビューするだけで出力されます。 
チャプタ名は最初から順にコンマで区切って書いていくだけです。



まとめて書くとこうなります。
str="Trim(29,5482)++Trim(7282,23553)++Trim(25353,46332)++Trim(49030,50377)"
str=TrimClean(str)
str=TrimSplit(str,1,3000,back=true)
str=TrimSplit(str,TrimCount(str)-1,2700,back=true)
str=TrimSplit(str,TrimCount(str),150,back=true)
WriteChapter(str,"chapter.txt","Avant,OP,A-part,B-part,ED,Next,EC",fps=framerate)

パート編成が毎回同じなら、トリムを入れ替えるだけで自動的にチャプターファイルを作れます。
10秒で約300フレームと覚えておくといろいろ捗ります。
OPやEDなら90秒なので約2700フレームです(本当は29.97fpsなので2697フレームくらいですが)

[12/06/15更新]
OPの後にCMを挟まないアニメの場合は、まずAパートが始まる位置を確認します。
例えば5000フレーム目でAパートが始まる場合、

str="Trim(29,23553)++Trim(25353,46332)++Trim(49030,50377)"
str=TrimClean(str)
str=TrimSplit(str,1,5000,back=false)#1個目のトリムを前から5000フレーム目で分割

これで4カットの状態になったので、あとは前述と同じです。



/*------------BDアニメでチャプターファイルを作る場合------------*/
①各パートが何フレーム目から始まるかメモる
str="trim(24,33950)"
str=TrimClean(str)
f1=888 #OP
f2=3021 #Aパート
f3=17599 #Bパート
f4=31387 #ED
f5=33567 #次回予告

②後のパートから順に切り離していきます。
str=TrimSplit(str,1,f5,back=false)#次回予告を分離
str=TrimSplit(str,1,f4,back=false)#EDを分離
str=TrimSplit(str,1,f3,back=false)#Bパートを分離
str=TrimSplit(str,1,f2,back=false)#Aパートを分離
str=TrimSplit(str,1,f1,back=false)#OPを分離
WriteChapter(str,"chapter.txt","Avant,OP,A-part,B-part,ED,Next",fps=framerate)

TVアニメでも正確にチャプタを打ちたい場合はこっちの方式で。

 

Aviutlの「マニュアル24fps」でも60iの24fps化が使えるようになったようです。
http://mytools.wktk.so/ts_tool/index.php

txt60mcHybridも(改)として使えるようですが、フレーム数が把握しづらい状況で使う場合は
こうした方がいいかもしれませんね。
txt60mcHybrid2.avsi
最初に全体を60fps化してから分割するのでのと比べるともしかしたら若干速度が落ちるかもしれませんが、
5の倍数フレームとかを気にせず使えると思います(たぶん)

前記事の補足

あ、どこかで60fps関数を2回かけて120fps化した後にSelectEvery(5,1)としても60fpsテロップを
24fps化できるとか聞いた事がある気がしますが、これだと"IIPPP"の時に背景の方を正しく24fps化
することができません。
SelectEvery(5,x)のxをどの値に変えてもどれか一つ正しく間引けない周期があるので、
結局のところ周期情報が必要です。

というわけでその辺のところを考慮して関数化するとこんな感じです。
Function ivtc_txt60mcL(clip src, int frame_ref)
{
f=frame_ref%5
offset=f/3
src
QTGMC(preset="fast")
SelectEvery(5,offset+1, offset+3)
}
60fpsテロップの移動距離は常に"3-2-3-2"という動きになります。
ivtc_txt60mcの簡易版と言ったところで、ちょっと動きのガタつきが大きい気がしますが、
TIVTC24P2とかでやっちゃうよりは断然マシだと思います。
縦テロップとかを高速で処理するのに使ってもいいかもしれません。
プロフィール

putin

Author:putin
ロゴ関係ソース

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

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

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

この人とブロともになる

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