如何使用xuggler从flashvideo中仅创建一个缩略图?

我试图从* flvvideo中随机创建一个缩略图。我在网上发现的代码示例并没有真正帮助。如果有人知道怎么做或者有代码或方法可以做,请分享/解释。谢谢。

我已经浏览了这里提供的示例代码(http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html),它可以从给定的输入video文件中创建缩略图。 为了只创建一个,您可以引入一个类级别的成员变量(在示例代码中,变量名称是imageGrabbed)。 这个变量只跟踪缩略图的生成,一旦创建了第一个缩略图,然后在调用函数中(在示例代码中,调用函数是main()),while循环退出。

希望这可以帮助。

此致,伊斯梅尔。

/** * VideoThumbnailsExample.java Oct 29, 2012 */ package com.test; 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; /** * 
 * Java File. * Title : VideoThumbnailsExample.java * Description :  * 

*/ public class VideoThumbnailsExample { public static final double SECONDS_BETWEEN_FRAMES = 1; private static final String inputFilename = "/Users/ismail/practice/vlc/sample.3gp"; private static final String outputFilePrefix = "/Users/ismail/practice/vlc/"; // 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) { long startTime = System.currentTimeMillis(); long stopTime = 0L; IMediaReader mediaReader = ToolFactory.makeReader(inputFilename); // stipulate that we want BufferedImages created in BGR 24bit color // space try { mediaReader .setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR); ImageSnapListener isListener = new ImageSnapListener(); mediaReader.addListener(isListener); // read out the contents of the media file and // dispatch events to the attached listener while (!isListener.isImageGrabbed()) { mediaReader.readPacket(); } /* while (mediaReader.readPacket() == null) ; */ //mediaReader.readPacket(); stopTime = System.currentTimeMillis(); } catch(Exception ex) { ex.printStackTrace(); } System.out.println("Total Time: " + (stopTime-startTime)); } private static class ImageSnapListener extends MediaListenerAdapter { public boolean imageGrabbed = false; 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()); this.imageGrabbed = true; //set this var to true once an image is grabbed out of the movie. // indicate file written double seconds = ((double) event.getTimeStamp()) / Global.DEFAULT_PTS_PER_SECOND; System.out.printf("at elapsed time of %6.3f seconds wrote: %s\n",seconds, outputFilename); //System.out.printf("at elapsed time of %6.3f seconds wrote: SOMEFILE\n",seconds); // update last write time mLastPtsWrite += MICRO_SECONDS_BETWEEN_FRAMES; } } private String dumpImageToFile(BufferedImage image) { try { String outputFilename = outputFilePrefix + System.currentTimeMillis() + ".jpg"; System.out.println("Thumbnail image name is going to be : =====>" + outputFilename); ImageIO.write(image, "jpg", new File(outputFilename)); return outputFilename; } catch (IOException e) { e.printStackTrace(); return null; } } public boolean isImageGrabbed() { return imageGrabbed; } } }