As a side product of current research, I manage to save a Processing screen in an MP4 video file with the use of the JCodec library. Download the former jcodec-0.1.5.jar into the code folder of your Processing sketch. The simplest way is to use the SequenceEncoder class to add a BufferedImage to the MP4 video. Remember to finish the video file before ending.
The following example captures the live video stream from a webcam and outputs to an external MP4 file in the data folder. Use the mouse click to control the recording.
Here is the source code.
import processing.video.*;
import org.jcodec.api.SequenceEncoder;
import java.awt.image.BufferedImage;
import java.io.File;
Capture cap;
SequenceEncoder enc;
String videoName;
boolean recording;
void setup() {
size(640, 480);
background(0);
cap = new Capture(this, width, height);
videoName = "bear.mp4";
recording = false;
frameRate(25);
smooth();
noStroke();
fill(255);
cap.start();
try {
enc = new SequenceEncoder(new File(dataPath(videoName)));
}
catch (IOException e) {
e.printStackTrace();
}
}
void draw() {
image(cap, 0, 0);
String fStr = nf(round(frameRate));
text(fStr, 10, 20);
if (recording) {
BufferedImage bi = (BufferedImage) this.getGraphics().getImage();
try {
enc.encodeImage(bi);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
void captureEvent(Capture c) {
c.read();
}
void mousePressed() {
recording = !recording;
println("Recording : " + recording);
}
void keyPressed() {
if (keyCode == 32) {
try {
enc.finish();
}
catch (IOException e) {
e.printStackTrace();
}
}
} |
import processing.video.*;
import org.jcodec.api.SequenceEncoder;
import java.awt.image.BufferedImage;
import java.io.File;
Capture cap;
SequenceEncoder enc;
String videoName;
boolean recording;
void setup() {
size(640, 480);
background(0);
cap = new Capture(this, width, height);
videoName = "bear.mp4";
recording = false;
frameRate(25);
smooth();
noStroke();
fill(255);
cap.start();
try {
enc = new SequenceEncoder(new File(dataPath(videoName)));
}
catch (IOException e) {
e.printStackTrace();
}
}
void draw() {
image(cap, 0, 0);
String fStr = nf(round(frameRate));
text(fStr, 10, 20);
if (recording) {
BufferedImage bi = (BufferedImage) this.getGraphics().getImage();
try {
enc.encodeImage(bi);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
void captureEvent(Capture c) {
c.read();
}
void mousePressed() {
recording = !recording;
println("Recording : " + recording);
}
void keyPressed() {
if (keyCode == 32) {
try {
enc.finish();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
The program also uses the undocumented functions, getGraphics() and getImage() to obtain the raw image of the Processing sketch window.