動画のフレームは、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 件のコメント:
コメントを投稿