VideoライブラリはファイルやWebカメラからの動画を扱うことができるライブラリである。
次の例は動画ファイルを読み込んで、それを表示する。動画のパス z:/Videos/douga.mp4 は適宜設定すること。なお、スケッチを保存してできるフォルダの中にdataという名前のフォルダを作成し、そこに置いたファイルであれば、ファイル名だけでよい。 mov.loop()は動画を繰り返し再生する。その代わりにmov.play()とすると、動画は1回だけ再生される。mov.available()で動画の次のコマが利用可能な状況であることを取得する。取得可能であれば、mov.read()で読み込んで、image(mov...)で表示する。
import processing.video.*; Movie mov; void setup(){
size(640, 360); mov = new Movie(this,"z:/Videos/douga.mp4"); mov.loop();
} void draw(){
if( mov.available() ){
background(0);
mov.read();
image( mov, 0, 0, width, height );
}
}
上の例では、画面の大きさに合わせて動画を拡大・縮小して表示する。
Processingの現バージョンでは、size()に変数を指定できないので、前もって動画の大きさがわかればそれを設定する。
もし、プログラム上で画面の大きさを動画の大きさに合わせたければ、次のようにmov.width, mov.heightで動画の大きさを得て、surface.setSize()で画面の大きさを設定する。 import processing.video.*; Movie mov;
void setup(){
size( 200, 200 );
mov = new Movie(this,"z:/Videos/douga.mp4");
mov.loop();
surface.setResizable( true );
while( !mov.available() ){
delay( 10 );
}
mov.read();
surface.setSize( mov.width, mov.height );
mov.jump( 0 );
surface.setResizable( false );
} void draw(){
if( mov.available() ){
background(0);
mov.read();
image( mov, 0, 0, width, height );
}
}
Image(mov,...)で画像を表示する代わりに、画像処理を行うことで、動画を加工して表示させることができる。次の例は、モザイク表示をする。int block=20でモザイクの大きさを20ピクセルに設定している。mov.get(i, j)で動画のコマの点(i, j)の色を取得し、一辺blockの正方形をその色で塗りつぶす。for(i=0; i<width; i+=block)は、iを0からwidthまでblockだけ増加させていく繰り返しを表す。 特に設定しなければ、動画と画面の大きさが異なるので、x = int( map(i, 0, width, 0, mov.width) )で、画面の横の位置iを動画の横の位置xに変換している。
import processing.video.*; Movie mov; int block = 20;
void setup(){
size( 400, 300 ); mov = new Movie(this, "z:/Videos/douga.mp4"); mov.loop();
}
void draw(){
int x, y;
if( mov.available() ){
background(0);
mov.read();
noStroke();
for( int i=0; i<width; i+=block ){
for( int j=0; j<height; j+=block ){
x = int( map(i, 0, width, 0, mov.width) );
y = int( map(j, 0, height, 0, mov.height) );
fill( mov.get(x, y) );
rect( i, j, block, block );
}
}
}
}
パソコンにカメラがついていれば、ファイルの代わりにカメラで撮影した動画を扱うことができる。 import processing.video.*; Capture cam;
void setup(){
size(640, 360); cam = new Capture(this); cam.start(); surface.setResizable( true ); surface.setSize( cam.width, cam.height ); surface.setResizable( false );
} void draw(){
if( cam.available() ){
background(0);
cam.read();
image( cam, 0, 0, width, height );
}
}
MovieをCaptureに、loopまたはplayをstartに置き換えればよい。