アニメーション編集 for AviUtl †
スクリプトを読み込んで動画を編集するプラグインです。
座標や色などのパラメータにフレーム番号を含む数式を記述できるので動きなどを表現できます。
読み込み動画のフォルダにanimation.txtを作成し、記述するとスクリプトに従って処理を行ないます。
animation.txtを編集した後は、再読込などをしなくても即時反映されます。
プラグインは画像処理用のanimate_v.aufと音声処理用のanimate_a.aufがあります。
設定ファイルはどちらも同じファイルを使用します。
Ver1.0aから開発環境をVC++2005からVC++2008に変更したのでランタイム(vcredist_x86.exe)が変更されています。
設定画面 †
設定画面ではマルチスレッドのスレッド数と表示するバッファを設定できます。
スレッド数はCPUのコア/スレッド数にあわせて下さい。
表示Bufのスライダーを動かすと各バッファ(buf[0]〜buf[9])の内容を確認できます。
通常は0を設定しておいてください。
設定画面から変数 a,b,c,d,u,v,x,y,z を設定できます。
スライダーの範囲は0〜4096になります。
クロマキー画像作成プラグイン †
入力支援用?プラグインをおまけに付けておきます。
指定範囲内、または範囲外の色を塗り潰してクロマキー合成用の画像またはマスク画像を作るプラグインです。
また、マウスクリックした場所の座標と色をポップアップダイアログで表示できます。
■更新履歴
2007.10.09 ver0.1
入力動画について †
DirectShow入力は正確な位置のフレームを取得できないことがあるのでなるべく使わないでください。
入力動画はHuffyuv + PCM音声などのフレーム間圧縮をしないコーデックで中間出力しておいたほうが良いです。
MPEG系などのフレーム間圧縮を行なうコーデックはフレーム単位でデコードが出来ないため処理が非常に遅くなります。
例えば、最大キーフレーム間隔300のMPEG系動画では最悪の場合、1フレームの画像を取得するのに
300フレーム分の画像をデコードしなければならないこともあります。
※copyframe()の処理速度の話なのでcopyframe()を使用しない場合はこの限りではありません。
入力動画が出力動画よりも短くても animation.txt の範囲指定でフレームを追加することが出来ます。
素材は一本の動画にまとめておいて、範囲指定で必要な部分だけ出力するような使い方になると思います。
使用例 †
画像処理 †
1.5倍速再生
copyframe(0, f*1.5, 0,0,w,h, 0,0)
逆再生
copyframe(0, m-f, 0,0,w,h, 0,0)
10枚の連番静止画を各300枚ずつ表示
[0-2999]
copyframe(0, f/300,0,0,w,h,0,0)
ネガポジ反転
color(0, 0,0,w,h, -1,-1,-1, 4096,0,0)
徐々にモノトーンにする
[0-99]
color(0, 0,0,w,h, 1,1-g/n,1-g/n, 0,0,0)
[100-]
color(0, 0,0,w,h, 1,0,0, 0,0,0)
クロスフェード(f=600でシーン切り替えの場合)
[550-599]
copyframe(1, f+50, 0,0,w,h, 0,0)
alpha(1,0, 0,0,w,h, 0,0, g/n)
[600-]
copyframe(0, f+50, 0,0,w,h, 0,0)
テロップの挿入 (f=1000:テロップ画像)
[0-100]
copyframe(1, 1000, 0,0,w,h, 0,0)
copy2(1,0, 0,0,w,h, 0,0, 2048)
テキストテロップ表示(縁取り)
font2("MS 明朝",120, 0,1,0, 10, 2048,-2048,2048, 4096,-2048,2048)
text(0, w/2,h-120, 1, "文字列")
モザイク(設定画面を利用) 変数設定(a,b, c,d, u) = (横位置,縦位置, 幅,高さ, 細かさ)
mosaic(0,1, 0,0, w,h, 0,0, u*100/4096+1,u*100/4096+1)
copy(1,0, a*w/4096,b*h/4096, c*w/4096,d*h/4096, a*w/4096,b*h/4096)
画面を4分割してそれぞれに動画を表示
resize(0,1, 0,0,w,h, 0,0, w/2,h/2)
copyframe(0, f+100, 0,0,w,h, 0,0)
resize(0,1, 0,0,w,h, w/2,0, w/2,h/2)
copyframe(0, f+200, 0,0,w,h, 0,0)
resize(0,1, 0,0,w,h, 0,h/2, w/2,h/2)
copyframe(0, f+300, 0,0,w,h, 0,0)
resize(0,1, 0,0,w,h, w/2,h/2, w/2,h/2)
swapbuf()
残像効果 (buf[2]〜buf[9]はプラグイン内で書き換えない限り内容は保持されます)
[0-0]
copy(0,2, 0,0,w,h, 0,0)
[0-]
alpha(0,2, 0,0,w,h, 0,0, 0.1)
copy(2,0, 0,0,w,h, 0,0)
字幕消し (defocus()を強くかけるので重いです)
[0-0]
fill(8, 0,0, w,h, 0,0,0)
fill(8, w/8-10,h*7/8+5,w-w/4+20,h/16-10, 4096,0,0)
fill(8, w/8,h*7/8,w-w/4,h/16, 4096,0,0)
defocus(8,9, 0,h*3/4,w,h/4, 0,3*h/4, 30,10)
[0-]
defocus(0,1, 0,h*3/4,w,h/4, 0,h*3/4, 30,30)
alpha4(1,0,9, 0,h*3/4, w,h/4 ,0,h*3/4, 0,h*3/4)
音声処理 †
フェードイン
[0-99]
a_volume(0,g/n,(g+1)/n,0)
クロスフェード(f=600でシーン切り替えの場合)
[550-599]
a_copyframe(1, f+50)
a_volume(0,1-g/n,1-(g+1)/n,0)
a_volume(1,g/n,(g+1)/n,0)
a_blend(1,0)
[600-]
a_copyframe(0, f+50)
逆再生
a_copyframe(1,m-f)
a_reverse(1,0)
1.5倍速再生
a_copyframe2(0,f*1.5,(f+1)*1.5)
処理範囲指定 †
フレームの範囲指定([開始-終了])
この記述以降はこの範囲に対して処理を行ないます。終了フレームは省略可能。
終了フレームが総フレーム数より大きい場合は総フレームを追加します。
フェードイン+左右反転
[0-99]
color(0, 0,0,w,h, g/n,g/n,g/n, 0,0,0)
[0-]
fliph(0,1,0,0,w,h,0,0)
swapbuf()
フレーム番号について †
フレーム番号は0から始まりますが、AviUtlの初期状態では+1されて1から表示されるようになっています。
システム初期設定で0から表示するように設定することが出来ます。
処理関数(Video) †
描画を行なうスクリーンはbuf[0]〜buf[9]まで用意されており、buf[0]が入出力される画像、
buf[1]〜buf[9]は作業用の一時画像置き場になります。
バッファ間で処理する関数は同一バッファ内で処理前と処理後の領域が重なる場合は正常動作しません。
座標は領域外でもそれなりに処理します。
なるべく処理結果は別バッファに置いてcopy()やswapbuf()などで書き戻してください。
- copyframe(buf, frame, x0,y0,w,h, x1,y1)
フレームコピー
frameで指定した番号のフレームをbufにコピーします。
frameの小数点以下は切り捨て。
コピー元:x0,y0,w(幅),h(高さ)
コピー先:x1,y1
- swapbuf()
バッファ入れ替え
buf[0]とbuf[1]を入れ替えます。
※ポインタの入れ替えだけなので処理は速いです。
※buf[0]とbuf[1]はAviUtl内の編集領域です。
※buf[2]〜buf[9]はプラグイン内の編集領域なのでプラグイン内で書き換えるまで内容は保持されます。
- dispsize(w,h)
画像サイズ変更
画像サイズを設定します。
全フレームに固定値を割り当てないと正常出力できません。
※AviUtlの実際のスクリーンサイズはシステム初期設定の設定値です。
※それに有効な画像サイズを割り当てて使用します。
※そのため表示範囲外にも画像を置けます。
- color(buf, x,y,w,h, Y0,Cb0,Cr0, Y1,Cb1,Cr1)
色変換
(Y, Cb, Cr) = (Y*Y0+Y1, Cb*Cb0+C1, Cr*Cr0+C1) に変換します。
輝度(Y)範囲:0〜4096
色差青(Cb)範囲:-2048〜2048
色差赤(Cr)範囲:-2048〜2048
※使用するフィルタによっては範囲外のデータが存在することもあります。
- color_rgb(buf, x,y,w,h, R0,G0,B0, R1,G1,B1)
色変換(RGB)
(R, G, B) = (R*R0+R1, G*G0+G1, B*B0+B1) に変換します。
赤色(R)範囲:0〜4096
緑色(G)範囲:0〜4096
青色(B)範囲:0〜4096
- fill(buf, x,y,w,h, Y,Cb,Cr)
塗りつぶし
(Y,Cb,Cr)の色で塗りつぶします。
- fill2(buf0,buf1, x0,y0,w,h, Y0,Cb0,Cr0, x1,y1, Y1)
塗りつぶし
buf0に対してbuf1をマスク画像として塗りつぶしを行います。
buf1のY1以下の色は透過色として扱います。
- ellipse(buf, x0,y0,a,b, Y,Cb,Cr)
楕円塗りつぶし
中心(x0,y0), x軸方向半径 a, y軸方向半径 b
- mkmask(buf0,buf1, x0,y0,w,h, x1,y1, Y0,Cb0,Cr0, Y1,Cb1,Cr1, Y2,Y3)
マスク作成
buf0の画像からbuf1にマスク画像を作成します。
(Y0〜Y1,Cb0〜Cb1,Cr0〜Cr1)の範囲の色は(Y2,0,0)それ以外は(Y3,0,0)の色に変換します。
範囲指定:(Y0,Cb0,Cr0) < (Y1,Cb1,Cr1)
クロマキー合成用のマスク作成などに使えます。
- mkmask_rgb(buf0,buf1, x0,y0,w,h, x1,y1, R0,G0,B0, R1,G1,B1, Y2,Y3)
マスク作成(RGB)
buf0の画像からbuf1にマスク画像を作成します。
(R0〜R1,G0〜G1,B0〜B1)の範囲の色は(Y2,Y2,Y2)それ以外は(Y3,Y3,Y3)の色に変換します。
- copy(buf0,buf1, x0,y0,w,h, x1,y1)
領域コピー
buf0からbuf1に領域コピーします。
- copy2(buf0,buf1, x0,y0,w,h, x1,y1, Y0)
領域コピー
buf0からbuf1へ領域コピーします。
buf0のY0以下の色は透過色として扱います。
テロップの挿入などに便利かも。
- copy3(buf0,buf1,buf2, x0,y0,w,h, x1,y1, x2,y2, Y2)
領域コピー
buf0からbuf1に領域コピーを行います。
buf2をマスク画像としてY2以下を透過色として扱います。
クロマキー合成などに使えます。
- alpha(buf0,buf1, x0,y0,w,h, x1,y1, alpha)
アルファ合成
buf0をbuf1に半透明で重ね合わせを行ないます。
透明度alpha:0〜1(透明〜不透明)
- alpha2(buf0,buf1, x0,y0,w,h, x1,y1 ,alpha, Y0)
アルファ合成
buf0をbuf1に半透明で重ね合わせを行ないます。
buf0のY0以下の輝度は透過色として扱います。
テロップなどの合成に使えるかも。
- alpha3(buf0,buf1,buf2, x0,y0,w,h, x1,y1, x2,y2, alpha, Y2)
アルファ合成
buf0をbuf1に半透明で重ね合わせを行ないます。
buf2をマスク画像としてY2以下の輝度は透過色として扱います。
- alpha4(buf0,buf1,buf2, x0,y0,w,h ,x1,y1, x2,y2)
アルファ合成
buf0をbuf1に半透明で重ね合わせを行ないます。
buf2をマスク画像として各画素の輝度Yを透過率として扱います。
輝度Y:0〜4096(透明〜不透明)
- flipv(buf0,buf1, x0,y0,w,h, x1,y1)
上下反転
buf0の上下反転画像をbuf1に作成します。
- fliph(buf0,buf1, x0,y0,w,h, x1,y1)
左右反転
buf0の左右反転画像をbuf1に作成します。
- resize(buf0,buf1, x0,y0,w0,h0, x1,y1,w1,h1)
リサイズ
buf0のリサイズ画像をbuf1に作成します。
リサイズと回転はバイリニア補完しています。
- rotate(buf0,buf1, rad, x0,y0,w,h ,x1,y1)
回転
buf0の回転画像をbuf1に作成します。
角度:rad
回転すると縦横はみ出しますが、はみ出した部分も描画します。
- mosaic(buf0,buf1, x0,y0,w,h, x1,y1, nw,nh)
モザイク
buf0のモザイク画像をbuf1に作成します。
横画素数:nw
縦画素数:nh
ブロックサイズnw×nhの画像になります。
- defocus(buf0,buf1, x0,y0,w,h, x1,y1, nw,nh)
ぼかし
buf0のぼかし画像をbuf1に作成します。
横画素数:nw
縦画素数:nh
nw×nhのサイズでバイリニアサンプリングします。
画素毎にnw×nhの範囲の平均値を計算するので重いです。
- diffuse(buf0,buf1, x0,y0,w,h,x1,y1, nw,nh)
画素拡散
各画素の位置をnw×nhの範囲に拡散します。
- gamma(buf, x,y,w,h, Y_g,Cb_g,Cr_g)
ガンマ補正
ガンマ値(Y_g,Cb_g,Cr_g) 値は1.0で元画像と同じ。
- posterize(buf, x,y,w,h, nY,nCb,nCr)
ポスタライズ
階調数を制限します。
nY,nCb,nCr:階調数。
- posterize_rgb(buf, x,y,w,h, nR,nG,nB)
ポスタライズ(RGB)
階調数を制限します。
nR,nG,nB:階調数。
- font("fname" ,size ,bold, italic, uline, Y,Cb,Cr)
フォント設定
fname: フォント名("MS 明朝"など)
size:フォントサイズ(高さ)
bold: 0:通常 1:太字
italic: 0:通常 1:斜体文字
uline: 0:通常 1:下線付加
Y,Cb,Cr: フォントの色
- font2("fname" ,size ,bold, italic, uline, ,width, Y0,Cb0,Cr0, Y1,Cb1,Cr1)
縁取りフォント設定
fname: フォント名("MS 明朝"など)
size:フォントサイズ(高さ)
bold: 0:通常 1:太字
italic: 0:通常 1:斜体文字
uline: 0:通常 1:下線付加
width: 縁取りの幅
Y0,Cb0,Cr0: フォントの色
Y1,Cb1,Cr1: 縁取りの色
- text(buf, x,y, align, "text")
テキスト出力
align: 0:左詰め 1:中央 2:右詰め
textで指定した文字列を描画します。
フォントはfont()またはfont2()で設定してください。
※記号'"'は'\"'、'\'は'\\'と置き換えて書いてください。
処理関数(Audio) †
音声もフレーム単位で処理を行ないます。
- a_copyframe(buf, frame)
bufにframeの音声データをコピーします。
frameの小数点以下は切り捨て。
- a_copyframe2(buf, sframe,eframe)
変速フレームコピー
bufにsframeからeframeまでのフレームを1フレームの長さにしてコピーします。
sframeとeframeは実数値。
- a_copy(buf0,buf1)
buf0をbuf1にコピーします。
- a_blend(buf0,buf1)
buf0の音声をbuf1に加算します。
加算なので音量に注意(あらかじめ音量を半分にしておくなど)してください。
- a_volume(buf, vol1,vol2, LR)
buf内の音声をvol1からvol2まで(フレーム開始から次フレーム開始まで)変化させます。
vol1,vol2:倍率
LR(0=L+R,1=L,2=R)に対して処理を行います。
- a_mono(buf, LR)
モノラル化をします。
LR(0=L+R,1=L,2=R)
- a_reverse(buf0,buf1)
buf0を逆再生でbuf1にコピーします。
- a_noise(buf, vol)
ホワイトノイズを作成します。
音量:vol(0〜1)
「ザー」という音。
- a_tone(buf, Hz, shape, vol)
トーン信号を作成します。
周波数:Hz
波形:shape 0:正弦波,1:矩形波
音量:vol(0〜1)
「ピー」とかは1000Hzくらいかな?
- a_voicechg(buf, hz)
ボイスチェンジャー
周波数hzで変調をかけます。
数式について †
以下の変数・演算子・関数が使えます。
- 関数
ceil floor abs sqrt exp log log10 sin cos tan
asin acos atan sinh cosh tanh asinh acosh atanh
j0 j1 y0 y1
- 変数
- f:フレーム番号
- s:処理範囲開始フレーム番号
- e:処理範囲終了フレーム番号
- g:処理範囲内フレーム番号(f-sと同等)
- n:処理範囲内フレーム数(e-s+1と同等)
- m:総フレーム数
- p:円周率
- w:表示画面幅
- h:表示画面高さ
- i:編集画面幅(システム初期設定値)
- j:編集画面高さ(システム初期設定値)
- a,b,c,d,u,v,x,y,z:設定画面の設定値
上記以外の変数 A〜Z、a〜z はスクリプト中で設定が出来ます。
[0-50]
A=w/4
[51-]
A=w/2
[0-]
fill(0, 0,0,A,h, 2000,0,0)
更新履歴 †
2008.05.11 ver1.1 font2()追加、text()修正
2008.05.09 ver1.0a ランタイムの変更(VC++2005→VC++2008)
2008.05.04 ver1.0 text()の文字化け対策
2007.11.05 ver0.9 a_voicechg()追加、posterize(),posterize_rgb()修正
2007.10.31 ver0.8 ellipse(),posterize(),posterize_rgb(),color_rgb(),mkmask_rgb()追加、text()修正
2007.10.28 ver0.7 変数に代入できるようにした
2007.10.25 ver0.6 a_copyframe2(),font(),text()追加、diffuse()修正ほか
2007.10.23 ver0.5 設定画面に変数追加ほか
2007.10.21 ver0.4 gamma(),diffuse()追加
2007.10.18 ver0.3 マルチスレッド対応、defocus(),a_noise(),a_tone()修正ほか
2007.10.08 ver0.2 mkmask()追加
2007.10.08 ver0.1 公開