Tometoyou
Tometoyou

Reputation: 8376

How to get a thumbnail of an uploaded video file?

I've been trying to create a thumbnail for an uploaded file for a few days now to no avail. I've tried Xuggler, FFMpegFrameGrabber, and some other random code and none of it seems to work. It should be a trivial task to capture a single frame from a video. Anyone know how I can do this?

Upvotes: 3

Views: 12250

Answers (6)

Anuresh Verma
Anuresh Verma

Reputation: 1058

Follow this link for dependency

FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber("/home/anuresh/Downloads/avw.mp4");

frameGrabber.start();

Java2DFrameConverter aa = new Java2DFrameConverter()

try {
    BufferedImage bi

  //  for (int i = 0; i < 1000; i++) {
        Frame f = frameGrabber. grabKeyFrame() ;

        bi = aa.convert(f)
    while (bi!=null)
    {

        ImageIO.write(bi, "png", new File("/home/anuresh/Downloads/thumb/jkkjkjg" + System.currentTimeMillis() + ".png"));

        f = frameGrabber.   grabKeyFrame() ;
        bi = aa.convert(f)
    }
    frameGrabber.stop();
} catch (Exception e) {

    e.printStackTrace();
}

Upvotes: 4

Archimedes Trajano
Archimedes Trajano

Reputation: 41290

Using humble-video and handling rotated video images

import io.humble.video.*;
import io.humble.video.awt.MediaPictureConverter;
import io.humble.video.awt.MediaPictureConverterFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.*;
import java.nio.file.Path;

        demuxer = Demuxer.make();
        demuxer.open(videoFile.toString(), null, false, true, null, null);
        final int numStreams = demuxer.getNumStreams();
        int streamIndex = -1;
        Decoder videoDecoder = null;
        String rotate = null;
        for (int i = 0; i < numStreams; ++i) {
            final DemuxerStream stream = demuxer.getStream(i);
            final KeyValueBag metaData = stream.getMetaData();
            final Decoder decoder = stream.getDecoder();
            if (decoder != null && decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) {
                videoDecoder = decoder;
                streamIndex = i;
                rotate = metaData.getValue("rotate", KeyValueBag.Flags.KVB_NONE);
                break;
            }
        }
        if (videoDecoder == null) {
            throw new IOException("Not a valid video file");
        }
        videoDecoder.open(null, null);

        final MediaPicture picture = MediaPicture.make(
            videoDecoder.getWidth(),
            videoDecoder.getHeight(),
            videoDecoder.getPixelFormat());

        final MediaPictureConverter converter =
            MediaPictureConverterFactory.createConverter(
                MediaPictureConverterFactory.HUMBLE_BGR_24,
                picture);

        final MediaPacket packet = MediaPacket.make();
        BufferedImage image = null;
        MUX:
        while (demuxer.read(packet) >= 0) {
            if (packet.getStreamIndex() != streamIndex) {
                continue;
            }
            int offset = 0;
            int bytesRead = 0;
            videoDecoder.decodeVideo(picture, packet, offset);
            do {
                bytesRead += videoDecoder.decode(picture, packet, offset);
                if (picture.isComplete()) {
                    image = converter.toImage(null, picture);
                    break MUX;
                }
                offset += bytesRead;

            } while (offset < packet.getSize());
        }
        if (image == null) {
            throw new IOException("Unable to find a complete video frame");
        }
        if (rotate != null) {
            final AffineTransform transform = new AffineTransform();
            transform.translate(0.5 * image.getHeight(), 0.5 * image.getWidth());
            transform.rotate(Math.toRadians(Double.parseDouble(rotate)));
            transform.translate(-0.5 * image.getWidth(), -0.5 * image.getHeight());
            final AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
            image = op.filter(image, null);
        }

        final Path target = videoFile.getParent().resolve(videoFile.getFileName() + ".thumb.jpg");

        final double mul;
        if (image.getWidth() > image.getHeight()) {
            mul = 216 / (double) image.getWidth();
        } else {
            mul = 216 / (double) image.getHeight();
        }

        final int newW = (int) (image.getWidth() * mul);
        final int newH = (int) (image.getHeight() * mul);
        final Image thumbnailImage = image.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        image = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_BGR);

        final Graphics2D g2d = image.createGraphics();
        g2d.drawImage(thumbnailImage, 0, 0, null);
        g2d.dispose();

        ImageIO.write(image, "jpeg", target.toFile());
        return target.toAbsolutePath();

Upvotes: 0

Ayush
Ayush

Reputation: 759

package com.tape.controller;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.imageio.ImageIO;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.OpenCVFrameGrabber;

public class VideoThumbTaker {

    protected String ffmpegApp;

    public VideoThumbTaker(String ffmpegApp)
    {
        this.ffmpegApp = ffmpegApp;
    }

    public void getThumb(String videoFilename, String thumbFilename, int width, int height,int hour, int min, float sec)
      throws IOException, InterruptedException
    {
        ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y", "-i", videoFilename, "-vframes", "1",
    "-ss", hour + ":" + min + ":" + sec, "-f", "mjpeg", "-s", width + "*" + height, "-an", thumbFilename);
        Process process = processBuilder.start();
        InputStream stderr = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null);
        process.waitFor();
    }

    public static void main(String[] args) throws Exception, IOException
    {
        FFmpegFrameGrabber g = new FFmpegFrameGrabber("C:\\JavaEE\\New Project\\tape\\src\\main\\webapp\\web-resources\\videos\\vid.mp4");
        g.setFormat("mp4");
        g.start();

        for (int i = 0 ; i < 50 ; i++) {
            ImageIO.write(g.grab().getBufferedImage(), "png", new File("C:\\JavaEE\\New Project\\tape\\src\\main\\webapp\\web-resources\\thumbnails\\video-frame-" + System.currentTimeMillis() + ".png"));
        }

         g.stop();
    }
}

I have used this Java code using FFMpegFrameGrabber to create thumnails of a video. Try it out.

Maven Dependency :

<dependency>
   <groupId>org.bytedeco</groupId>
   <artifactId>javacv</artifactId>
   <version>0.8</version>
</dependency>

Upvotes: 6

Leo_Lai
Leo_Lai

Reputation: 41

I have wrote a simple example using io.humble to create a video picture. But it's a scala class. You can check it and modified it to java version as you like.

Take a look at: https://github.com/LeoWolfLai/io.humble-example/blob/master/io.humble-example.scala

Upvotes: 1

vzamanillo
vzamanillo

Reputation: 10404

You can use humble-video (Xuggle-xuggler sucesor)

Using with maven:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.humble</groupId>
      <artifactId>humble-video-all</artifactId>
      <version>0.2.1</version>
    </dependency>
  </dependencies>
</project>

There is no example with humble-video, but I suppose it is similar to xuggler, take a look at DecodeAndCaptureFrames.java

Upvotes: 0

ashok_rajput
ashok_rajput

Reputation: 89

use ffmpegthumbnailer fast and lightweight video thumbnailer.

Upvotes: 0

Related Questions