Video Processing Library for Java

If you're looking to do low level operations such as extracting frames and manipulating them, then Xuggler would be the best choice, because the APIs are geared around this low level. It works on ffmpeg so can handle all types of video encodings.

Don't use JMF for anything, it's old, outdated and buggy - GStreamer is good, but the API lends itself more to playing videos rather than manipulating the frames.


You can try Marvin Framework. It uses JavaCV for video encodings and device access, but all image processing algorithms are pure Java.

It's very easy to load a video and process the frames in real time, as shown in the edge detection example below.

enter image description here

Source code:

import static marvin.MarvinPluginCollection.*;

public class SimpleVideoProcessing extends JFrame implements Runnable{

    private MarvinVideoInterface    videoAdapter = new MarvinJavaCVAdapter();
    private MarvinImagePanel        videoPanel = new MarvinImagePanel();
    private MarvinImage             videoFrame, videoOut = new MarvinImage(640,480);

    public SimpleVideoProcessing() throws MarvinVideoInterfaceException{
        super("Simple Video Processing using Marvin");
        add(videoPanel);
        // Load video file and start the processing thread
        videoAdapter.loadResource("./res/snooker.wmv");
        new Thread(this).start();
        setSize(640,500);
        setVisible(true);
    }

    public void run() {
        try {
            while(true){
                // Request, process and show the video frame.
                videoOut.clear();
                videoFrame = videoAdapter.getFrame();
                prewitt(videoFrame.clone(), videoOut);
                videoPanel.setImage(videoOut);
            }
        } catch (MarvinVideoInterfaceException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws MarvinVideoInterfaceException {
        new SimpleVideoProcessing().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}