2011/03/24

動画ファイルから画像を取得してサムネイル生成などを行う

動画ファイルから寸法などの情報や任意のフレームの画像を取得できる「Video」ユニットを暫定的に実装しました。

動画のフレームは、Imageユニットで定義されているImageオブジェクトとして取得され、リサイズなど様々な処理が可能です。

下記のスクリプトは、コマンドライン引数で指定した動画ファイルから等間隔にフレームを抜き出し、縮小して並べた画像をファイルに保存するという例です。
var file=cwd().file(Main.params[0]);
var scale=4;//縮小率
var cx=4, cy=4;//横、縦に並べる数
try{
    var vf=require('Video').VideoFile.open(file);
    var st=vf.openVideo();
    var dist=Math.floor(st.length/(cx*cy));
    var w=Math.floor(st.width/scale), h=Math.floor(st.height/scale);
    var img=require('Image').Image.create(w*cx,h*cy);
    for(var i=0;i<cy;i++){
        for(var j=0;j<cx;j++){
            try{
                var frame=st.getFrazme((i*cx+j)*dist);
                img.drawImage(frame,w*j,h*i,w,h);
            }finally{
                free(frame);
            }
        }
    }
    img.save(cwd().file(file.name+'.jpg'),{quality:80});
}finally{
    free(st,vf,img);
}
実行すると、左記のような画像ファイルが生成されます。


現在の所、VideoForWindowsのAPIを利用しているため、AVIなど限られた形式にしか対応していませんが、AviSynthをインストールして、DirectShowSource()などで動画を読み込むAVSスクリプトを作成してそれを読み込むようにすれば、MPEGなど他の形式にも対応させられるはずです。

0 件のコメント:

コメントを投稿