上記の広告は1ヶ月以上更新のないブログに表示されています。 新しい記事を書く事で広告が消せます。
tsのままサンプルを集めるのは容量的に大変なので、動くロゴの出る部分だけをトリム&クロップして集めましょう。
avisynth用のロゴ(YV12)を集める場合は、以下のbatファイルにavsを投げれば
ファイル名を指定するだけで中間ファイルを保存できます。
@echo off SET pipe="avs2pipemod.exe" SET dir="サンプルを集めるフォルダパス" SET in="%~1" SET ext=".y4m" SET op=-y4mt set /p num="番号を指定してください>" %pipe% %op% %in% > "%dir%%num%%ext%" ファイル名を数字にしておけば、まとめて読み出す時に便利です。
#集めたサンプルから任意のフレーム番号を抜き出して繋げるスクリプト #各サンプルはロゴの開始位置が全て同じである必要がある function Loady4ms(int frame_num,int sample_count,int num,int "start",clip "c2") { start =default(start,1) c2 = default(c2,blankClip()) folder="サンプルを集めたフォルダパス" ext=".y4m" path =folder + string(start) + ext load=RawSource(path).trim(frame_num,-num) c2 =(start==1)?load:c2++load start=start+1 return (start>sample_count)?c2:Loady4ms(frame_num,sample_count,num,start,c2) } 上記のスクリプトを使ったavsをAviutlに渡して解析します。
frame=100 #抜き出すフレーム番号 sample=412 #集めたサンプルの総数 num=1 #各サンプルのフレーム数 Loady4ms(frame,sample,num) #左や上をcropしてサンプルを集めている場合はここでAddBordersで元の位置に戻す。 AddBorders(100, 0, 0, 0) YV12toYUY2(itype=0,interlaced=true,cplace=0) サンプル数が数百では少ないように思うかもしれませんが、ほぼ全フレームがシーンチェンジ(^^;)なので
300くらいあればそこそこ綺麗にロゴデータが作れます。
赤いアレの場合、一番組につき2~3回流れていて、毎日3、4本放映されているので
1ヶ月分くらい集めれば最低限必要なサンプル数が集まると思います。
Aviutl用のサンプルを集める場合はtsソースをm2v.aui等で直接読み込み、AviutlのAvi出力で保存します。
集めたサンプルから任意のフレームを抜き出すスクリプトはy4m版とほぼ同じです。
function LoadAvis(int frame_num,int sample_count,int num,int "start",clip "c2") { start =default(start,1) c2 = default(c2,blankClip()) folder="サンプルを集めたフォルダパス" ext=".avi" path =folder + string(start) + ext load=AVISource(path).trim(frame_num,-num) c2 =(start==1)?load:c2++load start=start+1 return (start>sample_count)?c2:LoadAvis(frame_num,sample_count,num,start,c2) } ★その他メモ
・ 同じサンプルのフレームを単純に水増ししてサンプル数を増やすのは逆効果なのでやらない方がいいです。
・ Overlayでブレンドすればサンプル数を水増しできますが、これもオリジナルのサンプル数が十分に揃ったら
使わない方がよさげです。
サンプルを集めるためにavsplogo.jpg通りにスクリプトを書きましたが、
TrimSelectの部分でno functionと出ました。
ブログ内検索でTrimSelectの関数を見つけて、記述したのですが、
count=default(count,0)/*繰り返し処理用*/
の部分でシンタックスエラーが出ます。
文字列のTrimを編集する関数集のページに
※ここに書かれていない繰り返し処理用の引数は使用しないこと
という注意書きが書かれていますが、詳細を教えてください。
標準のavisynthではfor文が使えないため、引数に結果を
記憶させて繰り返し処理を行っています。
繰り返し処理用の引数はユーザーが指定しないで下さい。
本当は関数内関数にして隠蔽した方が良かったかもしれません。
返答ありがとうございます、
以下avs
SetMemoryMax(512)
SetMTMode(mode=2,threads=0)
global Source = "D:\WORK\Encode\WorkEnc\0011\最近、妹のようすがちょっとおかしいんだが。 第4話 [BS11] 2014年01月30日 27時00分00秒(木曜日).d2v"
video = MPEG2Source(Source)
audio = BassAudioSource("D:\WORK\Encode\WorkEnc\0011\最近、妹のようすがちょっとおかしいんだが。 第4話 [BS11] 2014年01月30日 27時00分00秒(木曜日) PID 141 DELAY -367ms.aac")
AudioDub(video, audio)
DelayAudio(-0.367)
str_trim="Trim(930,6353)++Trim(8153,23946)++Trim(25745,53052)"
v01=Eval(TrimSelect(str_trim,1)).crop(100,0,-1340,-800).trim(0,219)
v02=Eval(TrimSelect(str_trim,2)).crop(100,0,-1340,-800).trim(0,219)
v03=Eval(TrimSelect(str_trim,3)).crop(100,0,-1340,-800).trim(0,219)
v02
return last
function TrimSelect(string str_trim,int int_select,int "count"){
count=default(count,0)/*繰り返し処理用*/
count=count+1
int_s=Findstr(str_trim,"(")
int_c=Findstr(str_trim,",")
int_e=Findstr(str_trim,")")
int_range1=int_c-int_s-1
int_range2=int_e-int_c-1
val1=int(Value(MidStr(str_trim,int_s+1,int_range1)))
val2=int(Value(MidStr(str_trim,int_c+1,int_range2)))
temp="Trim("+string(val1)+","+string(val2)+")"
_str_trim=RightStr(str_trim,StrLen(str_trim)-int_e)
int_next=Findstr(_str_trim,"(")
return (count >= int_select||int_next==0)?temp:TrimSelect(_str_trim,int_select,count)
}
修正お願いします。
僕の環境では特に問題は起こらないので何とも。
とりあえずロゴを集めるだけならaudioは要らないので不要な要素を一個ずつ除いてはどうでしょうか。
count=default(count,0)でsyntaxエラーが起きるそうですが、
試しに以下の関数ではどうでしょうか。
function DefaultTest(clip c, in "count")
{
count = default(count,0)
return c
}
これでエラーが起きるなら環境に何か問題がありそうです。
早速試してみました。
しかし、動かない...
環境に問題あると思ってCropを使います。
疑問ですが、出力したy4mをmediainfoで調べると、
Progressiveになっていますが合っているのでしょうか?
あ、すいません。上のコメントのは引数のintのtが抜けてましたね。
もう一度試してみて下さい。
defaultが使えないとほとんどのユーザー関数が使えなくて詰んでると思うんで・・
> Progressiveになっていますが合っているのでしょうか?
問題ないです。
修正をお願いしましたavsへ
function DefaultTest(clip c, int "count")
{
count = default(count,0)
return c
}
を追記したのですが使い方は会っていますか?
count=default(count,0)/*繰り返し処理用*/ でsyntaxエラーが起きます。
又、他に必要なユーザー定義関数はありますか。
defaultはavisynth内蔵functionなんで、それが構文エラー出すというのは
ちょっと聞いたことのない話なんでこれ以上は僕には分かりません。
いくつも質問に答えて下さり関数も作っていただいて感謝します。
ここの記事を参考にしてサンプルを集めていきたいと思います。
(現在サンプル数78:Aviutlで試しにlgdを作成して適用したところ、
ロゴが薄くなりました。sample=412が目標です。)