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