Archive for 11月 16th, 2012

カラオケ動画作成のために作ったavisynth関数(1)

avisynthだけでカラオケ動画を作る人はそういなさそうだし需要はなさそうだけど、
先月のカラオケ動画作成の時にいくつか関数を作ったので晒しておく。
ってか備忘録

うちが関数を使うときは編集しているavisynthスクリプトの最後に関数を書いておいて、本文から呼び出してる。しょっちゅうOS入れ替えるから別ファイルにして置いておくと入れ忘れちゃうしね。

  •  ぬるぬるフレームレート変更関数 Part2

ぬるぬる60fps化動画を作る時に最後に1行加えておけば簡単に60fps化ができる関数。
いままで指定できるfpsが整数だけだったんだけど今回から分数指定ができるようになって
汎用的に使えるようになった。

クソ重いからこれを付けてプレビューするのは無理っ。編集が終わって最後にチョコっとつければ簡単に高FPS化

準備

http://avisynth.org.ru/mvtools/mvtools2.html
から取ってきたMVtoolsのライブラリをAvisynthのプラグインフォルダに置いておく、
MT対応avisynthが必要(2.6.0以降なら大丈夫)

書式

nurunuru2(clip c, int “targetfps”, int “targetfps_den”)
c 対象動画クリップ
targetfps 目的のfpsの分子
targetfps_den 目的のfpsの分母(省略すると1)

たとえば
29.97fpsだと targetfps=30000 targetfps_den=1001
59.94fpsだと targetfps=60000 targetfps_den=1001
を指定する。

使用例

movie=ffVideoSource(“op.mpg”)
return movie.nurunuru2(60)

これで簡単に60fps化

source

function nurunuru2(clip c, int “targetfps”, int “targetfps_den”){
targetfps_den = default(targetfps_den, 1)
SetMTMode(2)
super=c.MSuper(pel=4, hpad=0, vpad=0)
backward_1=MAnalyse(super, chroma=false, isb=true, blksize=8, blksizev=8, searchparam=3, plevel=0, search=3, badrange=(-24))
forward_1=MAnalyse(super, chroma=false, isb=false, blksize=8, blksizev=8, searchparam=3, plevel=0, search=3, badrange=(-24))
backward_2 = MRecalculate(super, chroma=false, backward_1, blksize=8, blksizev=8, searchparam=2, search=3)
forward_2 = MRecalculate(super, chroma=false, forward_1, blksize=8, blksizev=8, searchparam=2, search=3)
backward_3 = MRecalculate(super, chroma=false, backward_2, blksize=8, blksizev=8, searchparam=1, search=3)
forward_3 = MRecalculate(super, chroma=false, forward_2, blksize=8, blksizev=8, searchparam=1, search=3)
c.MBlockFps(super, backward_3, forward_3, num=targetfps, den=targetfps_den, mode=0)
SetMTMode(1)
GetMTMode(false) > 0 ? distributor() : last
}

 

  •  フレーム数指定動画スピード変更関数

いままで、動画のスロー化とかを.ChangeFPS(15).Assumefps(movie)みたいにして数字をいろいろ入れ替えて試していたけど、
倍率を考えるより目的のフレーム数を指定した方が簡単だと思いついた。

書式

changespeed_frame(clip c,int “flamenum”)
c 対象動画クリップ
flamenum 目的のフレーム数

使用例

movie=ffVideoSource(“op.mpg”)
fullvideo=movie.Trim(0,300)++movie.Trim(300,400).changespeed_frame(150)++movie.Trim(400,500)
return fullvideo

動画の300~400フレームの部分を150フレームになるようにスロー再生にする。

source

function changespeed_frame(clip c,int “flamenum”)
{
return c.Changefps(c.FrameRate/c.FrameCount*flamenum).Assumefps(c.FrameRate)
#     return c.nurunuru2(targetfps = c.FrameRateNumerator*flamenum,targetfps_den=c.FrameRateDenominator*c.FrameCount).Assumefps(c.FrameRate)
}

上のnurunuru2関数を使うとキレイになるかもしれないので使いたい方をコメント(#)付けたり外したりして使ってみて。

割り算の切り捨ての関係で目的のframe数から±1するかもしれない。

  •  拡大縮小付き静止画スクロール関数

静止画を単純にスライドショーにするんじゃなくて、
スクロールするとなんかかっこよくなるよね。
って考えて作ってみた。
いろいろ盛り込んでいくうちにどんどん長くなっていった。
と書いているうちに拡大縮小は別関数に分けた方がいいような気がしてきた。

とりあえず、使うにはスクロールさせるのに十分大きな解像度(ピクセル数)の画像1フレームのクリップを用意して、
開始の中心点と終了の中心点、生成するフレーム数を指定するととりあえずスクロールしてくれるはず。

スクロールを始める前とかスクロールした後にしばらく絵を止めていたいことがよくあるから
それも指定できるようにしてる。
ついでにスクロールしながら拡大縮小できるかもしれない(未検証)

引数が多すぎるから簡単に呼べる中間関数を作った方がいいな。

プレビューするときは関数内のSpline36ResizeをPointresizeにしておけば軽くなる。
(条件分岐で切り替えたいけど困ったことにavisynthではif文が使えない)

書式

zoomscroll(clip imageclip, clip baseclip, int start_x, int start_y, int end_x, int end_y, int allframes, int “startstopframes”, int “endstopframes”, int “bcolor”, float “startzoom”, float “endzoom”, bool “preview”)

# (clip) imageclip : スクロールする画像(1フレームでいい)
# (clip) baseclip : 形式を合わせる動画
# (int)  start_x : 開始画像の中心点(x)
# (int)  start_y : 開始画像の中心点(y)
# (int)  end_x : 終了画像の中心点(x)
# (int)  end_y : 終了画像の中心点(y)
# (int)  allframes : 生成フレーム数
# (int)  startstopframes : 開始画像静止フレーム数 (default : 1)
# (int)  endstopframes   : 終了画像静止フレーム数 (default : 1)
# (int)  bcolor : 追加枠色 (Default : $FFFFFF)
# (float) startzoom : 開始画像拡大率 0.1~1(等倍)~N (default : 1)
# (float)   endzoom : 終了画像拡大率 0.1~1(等倍)~N (default : 1)
# (bool) preview    : プレビューフラグ (trueだとpreview用に高速に動く予定:未実装)

使用例

length=297
e_1=Imagesource(“01_natuki.png”,start=0,end=1,fps= movie.FrameRate)
e_2=Imagesource(“02_nene.png”,start=0,end=1,fps= movie.FrameRate)
e_3=Imagesource(“03_kagami.png”,start=0,end=1,fps= movie.FrameRate)
e_4=Imagesource(“04_numabuti.png”,start=0,end=1,fps= movie.FrameRate)
e_5=Imagesource(“05_tsukumo.png”,start=0,end=1,fps= movie.FrameRate)

e_1=e_1.Spline36Resize(1280,1216).zoomscroll(movie,640,856,640,360,length,1,40)
e_2=e_2.Spline36Resize(1280,1216).zoomscroll(movie,640,856,640,360,length,1,40)
e_3=e_3.Spline36Resize(1280,1216).zoomscroll(movie,640,856,640,360,length,1,40)
e_4=e_4.Spline36Resize(1280,1216).zoomscroll(movie,640,856,640,360,length,1,40)
e_5=e_5.Spline36Resize(1280,1216).zoomscroll(movie,640,856,640,360,length,1,20)

ss=Dissolve(e_1,e_2,e_3,e_4,e_5,35).Changefps(movie).ConvertToYV12

5枚の絵をしたから上へスクロールするものを5つつないだものができる。

source

function zoomscroll(clip imageclip, clip baseclip, int start_x, int start_y, int end_x, int end_y, int allframes, int “startstopframes”, int “endstopframes”, int “bcolor”, float “startzoom”, float “endzoom”, bool “preview”){

## set default value

startstopframes = Default(startstopframes,1)
endstopframes   = Default(endstopframes,1)
bcolor = Default(bcolor ,$FFFFFF)
startzoom=Default(startzoom,1)
endzoom=Default(endzoom,1)
preview=Default(preview,false)

bigimageclip = imageclip.AddBorders(baseclip.Width/2,baseclip.Height/2,baseclip.Width/2,baseclip.Height/2,bcolor)

bigimageclip = bigimageclip.Loop(allframes,0,0)
# return bigimageclip.info

## Calc Start Image
s_moviesize_x = Ceil (baseclip.Width / startzoom)
s_moviesize_y = Ceil (baseclip.Height / startzoom)

s_croppoint_x = start_x + baseclip.Width/2 – Round(s_moviesize_x/2)
s_croppoint_y = start_y + baseclip.Height/2 – Round(s_moviesize_y/2)

## Calc End Image
e_moviesize_x = Ceil (baseclip.Width / endzoom)
e_moviesize_y = Ceil (baseclip.Height / endzoom)

e_croppoint_x = end_x + baseclip.Width/2 – Round(e_moviesize_x/2)
e_croppoint_y = end_y + baseclip.Height/2 – Round(e_moviesize_y/2)

## create clip
resizefunc=”Pointresize” # not work
#resizefunc=”Spline36resize”

bigimageclip = bigimageclip.assumefps(baseclip.FrameRate)

startimage = bigimageclip.Spline36resize(baseclip.Width, baseclip.Height, s_croppoint_x, s_croppoint_y, s_moviesize_x, s_moviesize_y).Loop(startstopframes,0,0)

endimage = bigimageclip.Spline36resize(baseclip.Width, baseclip.Height, e_croppoint_x, e_croppoint_y, e_moviesize_x, e_moviesize_y).Loop(endstopframes,0,0)

animateimage = bigimageclip.Animate(0,allframes-startstopframes-endstopframes, resizefunc, baseclip.Width, baseclip.Height, s_croppoint_x, s_croppoint_y, s_moviesize_x, s_moviesize_y,   baseclip.Width, baseclip.Height, e_croppoint_x, e_croppoint_y, e_moviesize_x, e_moviesize_y)

## return clips

return animateimage
return startimage ++ animateimage ++ endimage

}

No Comments