Java: How do I create a movie from an array of images?

user361676 picture user361676 · Jan 13, 2012 · Viewed 28.7k times · Source

I basically have an matrix of bytes. Each row (meaning byte[]) represents an image. How do I create a movie out of that (any format - avi, mpeg, whatever), and save it as a file? Each image can be one of the following:

int JPEG    Encoded formats.
int NV16    YCbCr format, used for video.
int NV21    YCrCb format used for images, which uses the NV21 encoding format.
int RGB_565 RGB format used for pictures encoded as RGB_565.
int YUY2    YCbCr format used for images, which uses YUYV (YUY2) encoding format.
int YV12    Android YUV format: This format is exposed to software decoders and applications.

I can choose the format to whatever I like, as long as I get to create the movie.

public void createMovie(byte[][] images) {
  // and ideas on what to write here?
}

I don't need the actual implementation, just let me know the idea and what external libraries I need (if I need any).

I also need to edit some of the images (the byte stream) before I create the movie (to add some text). How can I do that?

The solution needs to be "Java only"! No external programs, no external commands (but I can use external jars).

Thanks!

Answer

jefflunt picture jefflunt · Jan 13, 2012

The solution seems to be to use Mencoder (or at least, that seems to be a semi-popular choice).

Here's a link that specifically addresses images-to-movies capabilities in Mencoder.

As for rendering text onto the frames before encoding them as part of the video, you can use Java2D's image manipulation libraries to simply draw text on top of the images beforehand For example:

That's one way to do it, and this FAQ should get you started in that direction with Java2D, font rendering, etc., and offer pointers to further resources.

The ImageIO library also allows you to read/write a number of image formats, effectively allowing you to transcode images from, say, .jpg -> BufferedImage -> .png, or any which way you need to do it, if you want to store the image files temporarily during the conversion process, and/or convert all the images to a single format when importing them for the conversion project, etc.

Depending on how many output formats you want to support, you'll probably do something like

public void createMovie(BufferedImage[] frames, String destinationFormat)

...where "destinationFormat" is something like "m4v", "mpeg2", "h.264", "gif", etc.