ニコカラメーカー2でエンコード回数を増やすことなく「あわあわ字幕」を作る方法


「A・ZU・NA」ランドの動画で、今までのassを使っていた時の同じ

  1. 1パート(1色)ごとに1つ白を塗りたい色、黒を塗らない部分とした「透過連番PNG」を出力 (3人+全員の4つ出力)
  2. Avisynthで連番PNGを読み込み、ASSの時と同じ処理を実行

という方法でパート分けあわあわ字幕を作っていたのだけど

「1」をニコカラメーカー2でやるには、

  1. 表示しないパートのフォント設定をすべて透明度MAX(A:を0)にする。
  2. あわあわにしたい部分を白、それ以外の部分を黒にする
  3. 透過PNGで出力
  4. 別の色を1~3まで繰り返し

というすごい面倒な作業があって、なかなかやる気にならなかった。
(assであわあわパート分け作業はどんなにパート数があっても1パートあたり5分以内に終わっていたので、数倍時間がかかってしまう)
(ニコカラメーカー2に「フォント設定を一括非表示化」とか「指定したフォント設定ごとに、透過連番PNG出力」とか、「複数のフォント設定を一括で色設定変更」とか、「歌詞編集の1つのフォント設定を全部別のフォント設定に入れ替え」とかの機能が欲しいなと思っていたけど要望が多すぎると思ったw)

色付けはニコカラメーカー2に任せて、泡だけ全字幕に乗せちゃえばいいんじゃないかと思いつきAvisynthで1発でできるようにしたのでご紹介します。

手順
1. こんなあわあわの元画像を用意します。泡以外の部分は透過なPNGになっています。
(これは以前青ジャンOP映像を見たときに、GIMPでぽちぽち自作したもの)

泡画像のダウンロードはこちらから

2.ニコカラメーカー2で、普通に色分けする。(今回白以外の色がついている文字部分に泡をかけます)

3.ニコカラメーカー2で、「連番PNG(字幕のみを透過で)」で出力

4.以下のようなavisynthスクリプトを用意する(テキストで「.avs」の拡張子で保存)
(毎回修正する箇所は上の4か所、泡とか同じなら2か所)

#字幕を載せるベースの動画を指定
moviefile=".\未来ハーモニー.mp4"
#ニコカラメーカー2で出力した連番PNGを指定(「_00001.png」の部分は除く)
jibakubase="msk\未来ハーモニー3_ニコカラメーカー2出力"
#上乗せする、透過画像を指定
overimage="../アルファ泡.png"
#字幕の中で、透過上乗せしない色を指定(白:$FFFFFF)
ignorecolor=$FFFFFF


#####   以降修正不要   #####
colerspace="RGB32"
movieoto=LWLibavAudioSource(moviefile).KillVideo
LWLibavVideoSource(moviefile,format=colerspace,repeat=true)#.threadrequest()
AudioDub(movieoto)
movie=last

movie
jimakupngpath=jibakubase+"_%05d.png"
subtitlemovie=ImageSource(jimakupngpath,start=1,end=movie.FrameCount(),fps=movie.Framerate  ,use_DevIL=true,pixel_type=colerspace,info=false)
subtitlemovie =  make_mask_brash_ue_alpha_img(subtitlemovie,overimage,ShowAlpha (subtitlemovie.ColorKeyMask($FFFFFF)))
Layer(subtitlemovie)
return last


function make_mask_brash_ue_alpha_img(clip c, string imageclip, clip alphainfo){

blushbase=Imagesource(imageclip,start=0,end=1,fps=c.FrameRate,pixel_type="RGB32")
StackVertical (blushbase,blushbase,blushbase)
tatesc(c,c.sectoframe(80.0))
blash=last.Loop().assumefps(c)
b_alpha=ShowAlpha (blash)
c.Overlay (blash,mask=b_alpha)
return last
}

function tatesc(clip imageclip, clip baseclip,int length, bool "muki"){
largeheight=imageclip.height*baseclip.width/imageclip.width
return imageclip.Spline36Resize(baseclip.width,largeheight).zoomscroll(baseclip,baseclip.width/2,baseclip.height/2,(baseclip.width)/2,(largeheight)-(baseclip.height)/2,length,1,1).assumefps(baseclip)
}

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"){
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)

## 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="Spline36resize"

bigimageclip = bigimageclip.assumefps(baseclip.FrameRateNumerator/baseclip.FrameRateDenominator)
startimage = bigimageclip.Spline36resize(baseclip.Width, baseclip.Height, s_croppoint_x, s_croppoint_y, s_moviesize_x, s_moviesize_y).Trim(1,1).Loop(startstopframes,0,0)
endimage = bigimageclip.Spline36resize(baseclip.Width, baseclip.Height, e_croppoint_x, e_croppoint_y, e_moviesize_x, e_moviesize_y).Trim(1,1).Loop(endstopframes,0,0)
animateimage = bigimageclip.Trim(startstopframes,allframes-endstopframes).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 startimage ++ animateimage ++ endimage 
}
function sectoframe(clip c,float "sec")
{
    return round(sec * c.FrameRate)
}

5. 作成した.avsファイルをエンコードする

以上の手順で動画が出来上がり。(曲情報とかアイコンは別でつけたものなので今回関係ありません)

ニコカラメーカーで普通に作っても、
無圧縮AVI作成→エンコード
今回の方法でも
連番PNG作成→avs編集(数か所)→エンコード
なので、さほど手間が増えません^^

  1. No comments yet.
(公開されません。ってか記入しなくてもいいです)