niiyan's blog

niiyanの個人ブログ。

moviebarcode 風の画像を作成する AviSynth 関数

moviebarcode とは

moviebarcode というものがあります。

簡単に説明すると、moviebarcode とは、映画のすべてのフレームを左から順に並べて水平方向に圧縮してできた画像です。バーコードのように見えることから、「moviebarcode」と名付けられたものと思われます。

映画のコマを圧縮してバーコード化した「moviebarcode」 - GIGAZINE でも紹介されていますので、詳しくはそちらを参照してください。

MovieBarcode 関数 by um3k

さて、この moviebarcode を AviSynth で実現するための関数が先日公開されました。作者は、um3k 氏です。

Resize to 1 pixel wide? - Doom9's Forum

実際に使ってみました。

動作には、GScript が必要ですので、あらかじめ用意しておきます。

素材は、http://media.xiph.org/ldv/pub/test_sequences/601/Xiph.org :: Test Media )にあるテスト用動画の「576i25_stockholm_ter.yuv」です。YUV フォーマットで制作されたものなので、読み込みには RawSource を使用しました。

スクリプトサンプル

# プラグインの読み込み
LoadPlugin("C:\foo\plugins\rawsource.dll")
LoadPlugin("C:\foo\plugins\GScript.dll")
Load_Stdcall_Plugin("C:\foo\plugins\yadif.dll") # C プラグイン

# ソースの読み込み
RawSource("C:\bar\576i25_stockholm_ter.yuv", pixel_type="I420")

# インターレース解除
AssumeTFF() # トップフィールドファースト
Yadif() # たまたま手元にあった Yadif を使用

# ソースが短いのでループ
Loop(100)

# バーコード化
width = last.framecount()/100 # 総フレーム数の 1/100 にしてみた
height = last.height()/2 # 高さはソースの半分にしてみた
MovieBarcode(width, height)

return last

# MovieBarcode 関数 by um3k
function MovieBarcode(clip src, int w, int h)
{
GScript("""
   src = src.ConvertToRGB24()
   comp = src.BlankClip(width=1, height=h)
   for(f=1,w,1)
   {
       fc = src.framecount
       cf = (fc / w) * f
       s = src.SelectEvery(fc, cf).BilinearResize(8, h).HorizontalReduceBy2().HorizontalReduceBy2().HorizontalReduceBy2()
       comp = StackHorizontal(comp, s)
   }
   return comp.Crop(1, 0, 0, 0).Trim(0,1)
""")
}

結果

w=総フレーム数の場合

"width = last.framecount" の場合。フレーム数の多いクリップでは、処理に時間がかかります。

w=総フレーム数/8 の場合

"width = last.framecount()/8" とした場合です。

w=総フレーム数/25 の場合

"width = last.framecount()/25" の場合。

Loop(100), w=総フレーム数/100 の場合

スクリプトサンプルの結果です。

最後に

短くて変化の乏しい動画だったので、あまりバーコードっぽくなりませんでした。

それとけっこう重いと思うので、とくにフレーム数の多いソースの場合は注意した方がいいかもしれません。