お前らのショボイAvisynthスクリプト貼ってください
C3Dは前後フレームを参照する3D-NRも含んでるので
それだと、前後フレームが別フィールドの画を参照してしまう。
2Dのみのフィルタじゃなかったら、フィールドも分けるように。
でも同じフィルタが複数回動作できない作りのものもあるので要注意
wikiとかに説明があったかと思う。
separatefields
a=selecteven.Convolution3D("movieHQ")
b=selectodd.Convolution3D("movieHQ")
interleave(a,b)
lanczosresize(640,last.height)
weave
もちろんlanczosをC3Dの後ろに、それぞれくっつけても可。
というかそっちの方が間違いが起きない。
>>932 レスサンクスです。
LanczosをC3Dの後ろに引っ付けるということは
separatefields
a=selecteven.Convolution3D("movieHQ")
b=selectodd.Convolution3D("movieHQ")
a=selecteven.lanczosresize(640,240)
b=selectodd.lanczosresize(640,240)
interleave(a,b)
weave
でいいんでしょうか?
separatefields
a=selecteven.Convolution3D("movieHQ").lanczosresize(640,last.height)
b=selectodd.Convolution3D("movieHQ").lanczosresize(640,last.height)
interleave(a,b)
weave
または記述行を分けても良いが、その場合はこう書く
separatefields
a=selecteven
b=selectodd
a=a.Convolution3D("movieHQ")
b=b.Convolution3D("movieHQ")
a=a.lanczosresize(640,last.height)
b=b.lanczosresize(640,last.height)
interleave(a,b)
weave
または
separatefields
a=selecteven
a=a.Convolution3D("movieHQ")
a=a.lanczosresize(640,last.height)
b=selectodd
b=b.Convolution3D("movieHQ")
b=b.lanczosresize(640,last.height)
interleave(a,b)
weave
なるほど、そういうことでしたか。
助かりました。ありがとう!
えっと別に間違いじゃないんだが、記述を分ける場合だと
lanczosresize(640, a.height)
とかlastじゃなく、a,bを指定した方がよいかも。
ちなみにlastだと、separatefielsの直後のクリップを指すことになる。
hqdn3dってデフォだとかなり残像出ない?(特に暗い画面?)
3DNRってことで多少は仕方無いんだろうけど
939 :
名無しさん@編集中:2006/05/15(月) 06:39:26 ID:izQAtOkE
940 :
名無しさん@編集中:2006/05/17(水) 20:37:55 ID:Q+VbyTlE
941 :
名無しさん@編集中:2006/05/18(木) 01:18:24 ID:neDH5t/m
>>938 出るね。ちょうど漏れも気になってた。解決策あるのかな?ソース落としてみたけどワカラナス
942 :
名無しさん@編集中:2006/06/26(月) 14:10:07 ID:pJP+XK0V
24/30/60
VFR
PluginDir = "C:\Program Files\AviSynth 2.5\plugins\"
LoadPlugin(PluginDir + "DGDecode.dll")
LoadPlugin(PluginDir + "IT.dll")
LoadPlugin(PluginDir + "TDeint.dll")
MPEG2Source(E:\"hage.d2v")
Crop(8,0,704,480)
c1 = trim(0,1620).assumefps(59,94,false) #30
c2 = trim(621,2524).IT(fps=24, diMode=1).assumefps(59,94,false) #24
c3 = trim(2525,2772).TDeint(mode=1).assumefps(59,94,false) #60
c4 = trim(2773,2849).assumefps(59,94,false) #30
c5 = trim(2850,3669).IT(fps=24, diMode=1).assumefps(59,94,false) #24
c6 = trim(3670,3735).TDeint(mode=1).assumefps(59,94,false) #60
c1 + c2 + c3 + c4 + c5 + c6
return last
・タイムコード
# timecode format v1
assume 23.976
0,1620,29.97
2525,2772,59.94
2773,2849,29.97
3670,3735,59.94
よくわかってないのでつっこみください。
ってタイムコードめちゃくちゃだ。
trimもだ。何度もスマソ。
ソース読み込みr
その辺スルーしてくださいorz
もちつけw
0.627659574fps
素直にIts使っとけ
949 :
名無しさん@編集中:2006/06/26(月) 18:42:35 ID:urNk3DUg
これダウソしようとするとセキュウテイがはじくけど大丈夫?
>>942 なるほどそのアイデア面白い。漏れが初めて見ただけかもだけど。
FrameEvaluateあたりでタイムコードを別ファイルに出力できるようにすれば
単ファイルの.avsでVFRできるね。
日本では.auoでいきなり120にするのが一般的だけど
海外方式で似非30fps aviにタイムコードを利用してドロップフレームを挿入すれば
120fpsの疑似VFRもできると。
>>942 下のは漏れ風に書いちゃったやつだけどこういう事かな
#最初に良く使用する関数をあらかじめ定義して読み込む
Global Pr1 = AvsDir + "ProgreTFM32.avs" #TFM(d2V=Filename+".d2v",mode=3,PP=2)#,display=true)
Global Pr2 = AvsDir + "ProgreAuto0.avs" #Auto24fps(drop = False, threshold = 24, border = 16, mode = "", debug = False)
Global IV0 = AvsDir + "fps24Tdcm1.avs" #tdecimate(mode=1,hybrid=0,noblend=true)
Global IV1 = AvsDir + "fps24IT1.avs" #IT(fps = 24, ref = "TOP", diMode = 1) そのほか諸々・・
c=ソース読み込み好きなように
c1=Imp(c,0,0,Pr1,Rate)
Last=Imp(c,0,0,Pr2,Rate)
c10=c.AutoBob.Assumefps(29970,Rate,False)
Rate=1000
ofs=0
Trim(0+ofs,1620+ofs).Assumefps(29970,Rate,False)
\ + Imp(c1,1621+ofs,2524+ofs,IV0,Rate)
\ + Trim(C10,5050+ofs*2,5545+ofs*2).Assumefps(29970,Rate,False)
\ + Trim(2773+ofs,2849+ofs).Assumefps(29970,Rate,False)
\ + Imp(c,2850+ofs,3669+ofs,IV1,Rate)
\ + Trim(C10,7340+ofs*2,7471+ofs*2).Assumefps(29970,Rate,False)
Return Last
# timecode format v1
Assume 23.976
0,1620,29.97
1621,2343,23.9693694690266
2344,2839,59.94
2840,2916,29.97
3573,3704,59.94
定義関数とか
Function Imp(clip "Clip",int "Start",int "End",
\ String "Setting",int "Rate",bool "Connect")
{
FC = Eval("Clip.trim(Default(Start,0),Default(End,0))"
\ + "Import(Setting)")
C = Default(Connect,False) == True ?
\ Start == 0 ? FC : Clip.trim(0,-Start) + FC : FC
End = Default(End,0) < 0 ? Start : End
C = Default(Connect,False) == True ?
\ End == 0 ? C :
\ End == Clip.FrameCount()-1 ? C :
\ C+ Clip.trim(End + 1,0) : FC
C = Assumefps(C,29970,Default(Rate,1000),False)
return C
}
function AutoBob(clip Clip,int "Start",int "End")
{
color_space = clip.IsRGB24() ? "RGB24" : clip.IsRGB32() ? "RGB32" : "Others"
clip = ((color_space == "RGB24") || (color_space == "RGB32")) ?
\ clip.ConvertToYUY2(interlaced = true) : clip
c = Clip.trim(Default(Start,0),Default(End,0))
c1 = c.AutoDeint("")
c2 = c.SeparateFields().Trim(1, 0).Weave.AutoDeint("")
bbb_clip = Interleave(c1, c2).AssumeFrameBased()
return_clip = (color_space == "RGB24") ? bbb_clip.ConvertToRGB24(interlaced = true) :
\ (color_space == "RGB32") ? bbb_clip.ConvertToRGB32(interlaced = true) : bbb_clip
return return_clip
}
フレーム操作系はエクセルとVBAなどで極力自動化して
VFR用のタイムコード、WMToolのVFRエンコ定義ファイル、
120fpsならInsNull用のテーブルファイルを自動生成させるようにしてる。
でも管理できると修正がやりやすいというだけで
きっちりやろうとしたら力技でし'`,、'`,、(ノ∀`)'`,、'`,、
緑色の肉のカレー食えば直るよ!
(;´д`)うぇぅえ
>>951のようなスクリプトで
c
oldcount=framecount(c)
trim(xxx,xxx) + trim(xxx,xxx) + trim(xxx,xxx)
oldfps=framerate(c)
averagefps=(float(framecount(c))/float(oldcount))*oldfps
c = c.assumefps(averagefps)
としてaveragefpsの値を自動で他のスクリプトに読み込んで
エンコードの設定に使いたいけど俺の頭では無理だった
俺のような馬鹿にとって、trim連結スタイルのvfrは、trimのパートから
timecode fileへの変換の処理がやはり難物。今使ってる無理やり秀丸マクロだと
こ汚く柔軟性もなく、ちょっとした流儀の変更でも一苦労。やはり一度まじめに勉強しないと…
入力に関しては、VDMのScriptEditorをmayuで弄ったらだいぶ楽になり、自分なりに満足気味。日記おわり。
958 :
950:2006/06/27(火) 03:34:58 ID:w1mJ0NX4
てなわけでタイムコードも一緒に作る関数を作ってみた。
ロードされた瞬間にタイムコードファイルを生成。
フレーム数は別に計算しなくても取ればいいよね?という方向で。
tc2cfrで120化して確認。
もし使うなら2つの関数をどっかに追い出してImportするといいと思う。
FPSの数値もclipからとることにしたので
きれいな数値にしたい人はAssumeFPSとかで設定してくださいまし。
グローバル変数使っちゃってるのが汚いけど
なんかうまい方法あったら変えて。
大きすぎると怒られたので関数定義部と利用部を分割で。
959 :
950:2006/06/27(火) 03:35:56 ID:w1mJ0NX4
function WriteTimeCodeHeader(clip, timecode_path) {
clip.WriteFileStart(timecode_path, """ "# timecode format v1" """)
clip.WriteFileStart(timecode_path, """ "Assume " + string(clip.framerate) """, append=true)
return clip
}
function ProcessRangeVFR(clip, timecode_path, deintfunc, after_deint_func) {
tmp = clip
Strlen(Default(deintfunc, "")) > 0 ? Eval("tmp = tmp." + deintfunc) : nop()
Strlen(Default(after_deint_func, "")) > 0 ? Eval("tmp = tmp." + after_deint_func) : nop()
tmp.WriteFileStart(timecode_path, """ string(vfr_current_real_frame) + "," + \
string(vfr_current_real_frame + tmp.framecount - 1) + "," + string(tmp.framerate) """, append=true)
global vfr_current_real_frame = vfr_current_real_frame + tmp.framecount
return tmp.AssumeFPS(clip)
}
960 :
950:2006/06/27(火) 03:37:05 ID:w1mJ0NX4
function filterfunc(clip) {
return clip.Deen("a3d",1,4,5,2.0).LanczosResize(640,480,8,0,-8,0)
}
src = MPEG2Source(...)
timecode_path = "d:\timecode.txt"
global vfr_current_real_frame = 0
src.WriteTimeCodeHeader(timecode_path)
ProcessRangeVFR(src.Trim(44000,45375), timecode_path, "TFM().TDecimate(mode=1)", "filterfunc()") + \
ProcessRangeVFR(src.Trim(45376,48071), timecode_path, "", "filterfunc()") + \
ProcessRangeVFR(src.Trim(48072,48400), timecode_path, "TFM().TDecimate(mode=1)", "filterfunc()")
よくわかんないけどすごい
俺もよくわからんが、逆テレシネしたときの端数はどうなってるの?
>>942みたいにtrimでfps区切ったあとそのavsをAviutlに食わせて目視でフレームレートかわるシーンに移動してそのフレームをタイムコードに書く…
ってやりかたでVFR作って(る気になって)るんだけどもっとかしこいやり方誰かおすえてください。
>>953氏の自動化とか詳しく聞きたいです。
端数補正?なんて今まで考えたこともなかったし聞いてもおれの脳みそではよくわからんorz
964 :
950:2006/06/27(火) 12:40:40 ID:w1mJ0NX4
>>962 まずFramecountプロパティでそのクリップのフレーム数を取れるのが前提。
clip = other.Trim(0,20)
Subtitle(string(clip.Framecount)) # フレーム数を表示
そんで、clipに逆テレシネフィルタをかけるとそのフィルタによって
逆テレシネされた分クリップのフレーム数が変化するわけ
clip.IT(ref="TOP", fps=24).Framecount # => 減ってる
実際のフィルタによって生成された数を取得してるのでズレることはないはず。
あとはその出力を足し算して保持しておけば、
その範囲のスタートフレームもわかるから
フレーム位置を特定できる、というわけ。
# current変数に維持しておけば
# 範囲はcurrentからcurrent + clip.Framecount - 1で取れる。そして
current = current + clip.Framecount
# で更新。
ついでにAssumeだとか第3カラムのFPSの項目はFramerateプロパティで
取ってしまえば手動で書かなくていいかららくちん。
だからProcessRangeVFR(クリップ, タイムコードファイル名, 逆テレシネ関数片, フィルタ関数片)
で出力をつなげたものだけを出力すればずれてないタイムコードがでてくる。
逆テレシネ部分とフィルタ部分でEvalを使ってるのは
ただこの関数を汎用化したかっただけなので埋め込んでもかまわないし、
そもそも逆テレシネ済みのクリップとassumefpsの引数だけ渡したほうがよかったかもしれない。
あと、罠なのはWriteFileFirst. 引数の文字列が出力されるのではなく
引数の文字列が評価されたものが出力されるので気をつけること。
965 :
名無しさん@編集中:2006/06/27(火) 19:22:49 ID:w/zQyOy0
VirtualDubMod のショートカットキーが知りたいんですが
Home
End
Del
Ctrl+左右キー
Alt+左右キー
は分かりましたが,次のシーンを検索 みたいなボタンのショートカットが分かりません。
どなたか 教えてもらえませんかm(_ _)m
Ctrl+Shift+Right
メニュのgoを見れば全部分かるとは思うけど。
あ、modか。modでなくちゃダメ?本家じゃいかんの?
Shift+左右キーでキーフレームに位置付けられる。
エンコ済みのファイルを切り貼りする時にとても便利。
つかVirtualDubスレで聞けよw
ジタバタ
〃〃∩ _, ,_
⊂⌒( `Д´) modじゃなきゃ嫌だい。本家なんていらないやい
`ヽ_つ__つ
ジタバタ
そういやVDMは自分勝手にアサインしてるから元々の忘れたな
二画面ファイラのようにワンキーショートカットとかも
なんか面白そうなスクリプトでてきて、いい流れ。暇ができたら
有難く遊ばせてもらおうっと。今のところ自分の感心ランク一位は.u(かな
972 :
950:2006/06/28(水) 00:37:30 ID:PpOkZ2le
わお。今後も達人な人たちは気が向いたらshareよろしくです
>>964 やっぱり端数の処理は必要と思うよ。
反例を出すね。
今30フレームの画像があってこれを5分割する、つまり、1パッケージで6フレーム
この1パッケージを逆テレシネするとプラグインによっては5フレームを取得する。
でこれを結合すると30フレームを24fpsに変換したのに25フレーム取得することになる。
しかし、timecode v1の書式では各フレームを24fpsのタイミングで表示させてしまう。
従って、(25-24)*1/24秒分映像が長く表示される。
もちろん5の倍数でTrimすればこの問題はおきないけど、それは運だよね。
俺はなかなか運がいい
動画のフレーム番号を指定すると、そのフレーム画像をクリップボードに出力して終了するようなものを
クリップボードに貼り付けるのはどの編集ソフトでも出来るよ
VDubとかAviUtlとかでやれ
だいたい、フレーム番号探すのにDubとか使うしな。
面倒なのでそういうソフト作ってください。
getframe.exe とかのソフトで
getframe.exe -i InputFileName(avi) -f FrameNo
とするとフレームゲットできるようなの