xuggler

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 = 

  (long)(Global.DEFAULT_PTS_PER_SECOND * 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.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);

  

  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


    else



  return;


}
 


// 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 >= 



  MICRO_SECONDS_BETWEEN_FRAMES) {





  


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


    // indicate file written


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



  Global.DEFAULT_PTS_PER_SECOND;


    System.out.printf(




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




seconds, outputFilename);
 


    // update last write time


    mLastPtsWrite += MICRO_SECONDS_BETWEEN_FRAMES;


}
 

  }

  

  private String dumpImageToFile(BufferedImage image) {


try {


    String outputFilename = outputFilePrefix + 



   System.currentTimeMillis() + ".png";


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


    return outputFilename;


} 


catch (IOException e) {


    e.printStackTrace();


    return null;


}

  }
 
    }
 
}

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

Related Article:

Want to know how to develop your skillset to become a Java Rockstar?

Join our newsletter to start rocking!

To get you started we give you our best selling eBooks for FREE!

 

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

 

and many more ....

 

Receive Java & Developer job alerts in your Area

I have read and agree to the terms & conditions

 

Ilias Tsagklis

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

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

0 Comments
Inline Feedbacks
View all comments
Back to top button