Frames capture with Xuggler example

The concept of this tutorial is to open a media file, loop through a specific video stream and at specific intervals capture the corresponding frame, convert it to an image and dump the binary contents into a file. We are going to use Xuggler for that.
Here is the code that describes the above:

package com.javacodegeeks.xuggler;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.MediaListenerAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IVideoPictureEvent;
import com.xuggle.xuggler.Global;
public class VideoThumbnailsExample {
    public static final double SECONDS_BETWEEN_FRAMES = 10;
    private static final String inputFilename = "c:/Java_is_Everywhere.mp4";
    private static final String outputFilePrefix = "c:/snapshots/mysnapshot";
    // The video stream index, used to ensure we display frames from one and
    // only one video stream from the media container.
    private static int mVideoStreamIndex = -1;
    // Time of last frame write
    private static long mLastPtsWrite = Global.NO_PTS;
    public static final long MICRO_SECONDS_BETWEEN_FRAMES = 

    public static void main(String[] args) {

  IMediaReader mediaReader = ToolFactory.makeReader(inputFilename);

  // stipulate that we want BufferedImages created in BGR 24bit color space



  mediaReader.addListener(new ImageSnapListener());

  // read out the contents of the media file and

  // dispatch events to the attached listener

  while (mediaReader.readPacket() == null) ;
    private static class ImageSnapListener extends MediaListenerAdapter {

  public void onVideoPicture(IVideoPictureEvent event) {

if (event.getStreamIndex() != mVideoStreamIndex) {

    // if the selected video stream id is not yet set, go ahead an

    // select this lucky video stream

    if (mVideoStreamIndex == -1)

  mVideoStreamIndex = event.getStreamIndex();

    // no need to show frames from this video stream




// if uninitialized, back date mLastPtsWrite to get the very first frame

if (mLastPtsWrite == Global.NO_PTS)

    mLastPtsWrite = event.getTimeStamp() - MICRO_SECONDS_BETWEEN_FRAMES;

// if it's time to write the next frame

if (event.getTimeStamp() - mLastPtsWrite >= 



    String outputFilename = dumpImageToFile(event.getImage());

    // indicate file written

    double seconds = ((double) event.getTimeStamp()) / 



"at elapsed time of %6.3f seconds wrote: %sn",

seconds, outputFilename);

    // update last write time





  private String dumpImageToFile(BufferedImage image) {

try {

    String outputFilename = outputFilePrefix + 

   System.currentTimeMillis() + ".png";

    ImageIO.write(image, "png", new File(outputFilename));

    return outputFilename;


catch (IOException e) {


    return null;



This was an example on how to perform frames capture with Xuggler.

Related Article:

Ilias Tsagklis

Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.
Notify of

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Inline Feedbacks
View all comments
Back to top button