我正在尝试从 *flv 视频的随机位置仅创建一个缩略图。我在网上找到的代码示例并没有真正的帮助。如果有人知道如何做到这一点,或者有可以做到的代码或方法,请分享/解释。谢谢。
问问题
4418 次
1 回答
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;
}
}
}
于 2012-10-29T23:37:38.340 回答