我试图从* flv视频中随机创建一个缩略图。 我在网上找到的代码示例并没有多大帮助。如果有人知道该怎么做 或者有代码或方法,请分享/解释。谢谢。
答案 0 :(得分:12)
我已经浏览了这里提供的示例代码(http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html),它可以根据给定的输入创建缩略图视频文件。为了只创建一个,您可以引入一个类级别的成员变量(在示例代码中,变量名称是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;
/**
* <pre>
* Java File.
* Title : VideoThumbnailsExample.java
* Description : <Description>
* </pre>
*/
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;
}
}
}