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(); } } } |
The program also uses the undocumented functions, getGraphics() and getImage() to obtain the raw image of the Processing sketch window.