Reputation: 8376
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
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
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
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
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
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