Wednesday 30 November 2011

jjmpeg video creation

Been a bit quiet around here lately - actually it hasn't at all. Building going on next door means I haven't had a decent sleep in a couple of weeks and it's really wearing me down. Add to that I was stuck for a few weeks trying to grok some hairy maths for work and I just haven't had the inclination nor energy to pursue much other than eating, drinking, and some TV.

But back OT, I've started looking at moving my client's application to using jjmpeg - as I need 64-bit microsoft to work, and i'm also having some troubles with gc load with lots of transient objects.

Getting video frame reading going was trivial but I had to code up a fair bit of extra stuff to be able to create videos in proper containers which is the other requirement I have. I've checked in a first cut at that - although I need to do more testing particularly wrt GC performance.

I tried to come up with a helper class with a nice API to use it, and the following demonstrates it's use:
        AVFormatContext.registerAll();

JJMediaWriter writer = new JJMediaWriter(filename);
JJVideoStream vstream = writer.addVideoStream(width, height, fps, 400000);
BufferedImage image = vstream.createImage();

writer.open();

Graphics2D gg = image.createGraphics();
gg.setBackground(Color.black);
gg.setColor(Color.white);
for (int i = 0; i < fps * 5; i++) {
gg.clearRect(0, 0, width, height);
gg.drawString("Moving Text!", i, i);
vstream.addFrame(image);
}

writer.close();

Well I can't imagine it being much simpler than that. This also (for the most part) avoids transient object creation, so should be (relatively) efficient.

Unfortunately things aren't so clean under the bonnet, but I guess what you don't see wont hurt you will it?

The full example is in VideoWriter.java

No comments: