I adopt the DirectShow Java Wrapper to work in Processing with two classes, one for movie playback and one for video capture. At this moment, there are just two Java classes, not an individual library yet. Since it is for DirectShow, it is of course in Windows platform. You have to package the dsj.jar and the dsj.dll (32bit or 64bit according to your platform) into your code folder.
The DMovie class for movie playback
import de.humatic.dsj.*;
import java.awt.image.BufferedImage;
class DMovie implements java.beans.PropertyChangeListener {
private DSMovie movie;
public int width, height;
DMovie(String _s) {
movie = new DSMovie(dataPath(_s), DSFiltergraph.DD7, this);
movie.setVolume(1.0);
movie.setLoop(false);
movie.play();
width = movie.getDisplaySize().width;
height = movie.getDisplaySize().height;
}
public PImage updateImage() {
PImage img = createImage(width, height, RGB);
BufferedImage bimg = movie.getImage();
bimg.getRGB(0, 0, img.width, img.height, img.pixels, 0, img.width);
img.updatePixels();
return img;
}
public void loop() {
movie.setLoop(true);
movie.play();
}
public void play() {
movie.play();
}
public void propertyChange(java.beans.PropertyChangeEvent e) {
switch (DSJUtils.getEventType(e)) {
}
}
} |
import de.humatic.dsj.*;
import java.awt.image.BufferedImage;
class DMovie implements java.beans.PropertyChangeListener {
private DSMovie movie;
public int width, height;
DMovie(String _s) {
movie = new DSMovie(dataPath(_s), DSFiltergraph.DD7, this);
movie.setVolume(1.0);
movie.setLoop(false);
movie.play();
width = movie.getDisplaySize().width;
height = movie.getDisplaySize().height;
}
public PImage updateImage() {
PImage img = createImage(width, height, RGB);
BufferedImage bimg = movie.getImage();
bimg.getRGB(0, 0, img.width, img.height, img.pixels, 0, img.width);
img.updatePixels();
return img;
}
public void loop() {
movie.setLoop(true);
movie.play();
}
public void play() {
movie.play();
}
public void propertyChange(java.beans.PropertyChangeEvent e) {
switch (DSJUtils.getEventType(e)) {
}
}
}
Sample code that uses the DMovie class
DMovie mov;
void setup()
{
size(1280, 692);
background(0);
mov = new DMovie("Hugo.mp4");
mov.loop();
frameRate(25);
}
void draw()
{
image(mov.updateImage(), 0, 0);
} |
DMovie mov;
void setup()
{
size(1280, 692);
background(0);
mov = new DMovie("Hugo.mp4");
mov.loop();
frameRate(25);
}
void draw()
{
image(mov.updateImage(), 0, 0);
}
The DCapture class that performs video capture with the available webcam
import de.humatic.dsj.*;
import java.awt.image.BufferedImage;
class DCapture implements java.beans.PropertyChangeListener {
private DSCapture capture;
public int width, height;
DCapture() {
DSFilterInfo[][] dsi = DSCapture.queryDevices();
capture = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false,
DSFilterInfo.doNotRender(), this);
width = capture.getDisplaySize().width;
height = capture.getDisplaySize().height;
}
public PImage updateImage() {
PImage img = createImage(width, height, RGB);
BufferedImage bimg = capture.getImage();
bimg.getRGB(0, 0, img.width, img.height, img.pixels, 0, img.width);
img.updatePixels();
return img;
}
public void propertyChange(java.beans.PropertyChangeEvent e) {
switch (DSJUtils.getEventType(e)) {
}
}
} |
import de.humatic.dsj.*;
import java.awt.image.BufferedImage;
class DCapture implements java.beans.PropertyChangeListener {
private DSCapture capture;
public int width, height;
DCapture() {
DSFilterInfo[][] dsi = DSCapture.queryDevices();
capture = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false,
DSFilterInfo.doNotRender(), this);
width = capture.getDisplaySize().width;
height = capture.getDisplaySize().height;
}
public PImage updateImage() {
PImage img = createImage(width, height, RGB);
BufferedImage bimg = capture.getImage();
bimg.getRGB(0, 0, img.width, img.height, img.pixels, 0, img.width);
img.updatePixels();
return img;
}
public void propertyChange(java.beans.PropertyChangeEvent e) {
switch (DSJUtils.getEventType(e)) {
}
}
}
Sample code that uses the DCapture class
DCapture cap;
void setup()
{
size(640, 480);
background(0);
cap = new DCapture();
}
void draw()
{
image(cap.updateImage(), 0, 0, cap.width, cap.height);
} |
DCapture cap;
void setup()
{
size(640, 480);
background(0);
cap = new DCapture();
}
void draw()
{
image(cap.updateImage(), 0, 0, cap.width, cap.height);
}