2

我正在尝试从 *flv 视频的随机位置仅创建一个缩略图。我在网上找到的代码示例并没有真正的帮助。如果有人知道如何做到这一点,或者有可以做到的代码或方法,请分享/解释。谢谢。

4

1 回答 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 回答