Reputation: 53
Issue 1. When I use FFmpeg Java api, program doesn't run and print anything after grabber.start(). No preview generated.
public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException {
boolean isPreviewGenerated = false;
System.out.println("Request received to generate thumbnail for video.");
System.out.println("VideoFilePath : "+filePath);
System.out.println("ResultFileName : "+previewFileName);
try {
FFmpegFrameGrabber fGrabber = new FFmpegFrameGrabber(filePath);
System.out.println("FrameGrabber found "+fGrabber);
fGrabber.start();
System.out.println("Frame started..");
ImageIO.write(fGrabber.grab().getBufferedImage(), "jpg", new File(previewFileName));
System.out.println("Image written successfully as "+previewFileName);
isPreviewGenerated = true;
fGrabber.stop();
System.out.println("FrameGrabber stopped.. "+fGrabber);
} catch(Exception e){
System.out.println("Exception while creating video thumbnail : "+previewFileName+" - exception - "+e);
e.printStackTrace();
}
System.out.println("Image written successfully? "+previewFileName);
return isPreviewGenerated;
}
Result : Request received to generate thumbnail for video. VideoFilePath : /root/appdir/VIDEO20171124143855.mp4 ResultFileName : /root/appdir/vdthumb_0.jpg FrameGrabber found org.bytedeco.javacv.FFmpegFrameGrabber@3529360e
Nothing happens and gets printed after above statement..
Additional Information : I installed FFmpeg on Linux VPS as well and able to generate preview using command line root@vps19984[~/usr/appdir]#ffmpeg -i /root/appdir/.VIDEO20171123165555.mp4 -r 1 -f image2 image-%2d.png (above command ffmpeg generates preview successfully on linux box but I want to generate it via Java program)
Issue 2. When I use JCodec api, program generates a black image but NOT an image from video file. Code Sample :
public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException, JCodecException {
logger.info("Request received to generate thumbnail for video. VideoFilePath : "+filePath+", resultFileName "+previewFileName);
boolean isPreviewGenerated = false;
Picture framePic = FrameGrab.getNativeFrame(new File(filePath),20);
logger.info("Frame grabbed successfully..");
Transform transform = ColorUtil.getTransform(framePic.getColor(), ColorSpace.RGB);
Picture rgb = Picture.create(framePic.getWidth(), framePic.getHeight(), ColorSpace.RGB);
transform.transform(framePic, rgb);
logger.info("Frame transformed successfully to RGB..");
BufferedImage dst = new BufferedImage(rgb.getCroppedWidth(), rgb.getCroppedHeight(),
BufferedImage.TYPE_INT_RGB);
ImageIO.write(dst, "jpg", new File(previewFileName));
isPreviewGenerated = true;
logger.info("Is preview generated.."+isPreviewGenerated);
}
Result : Request received to generate thumbnail for video. VideoFilePath : /usr/appdir/VIDEO20171123165555.mp4, resultFileName /usr/appdir/vdthumb_0.jpg Frame grabbed successfully.. Frame transformed successfully to RGB.. Is preview generated..true
Issue : A black jpg image of 5 KB gets generated by JCodec
Upvotes: 1
Views: 2244
Reputation: 53
Thanks Urvashi for all your comments and suggestion. With FFMpeg, things are not working on my environment. I am not getting any exception either. I will try futher and see what is the issue.
But with JCodec (Issue no. 2) I am able to generate the preview with following code:
In pom.xml added following two dependencies:
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.2</version>
</dependency>
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec-javase</artifactId>
<version>0.2.1</version>
</dependency>
And in java file written following code:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.jcodec.api.JCodecException;
import org.jcodec.api.awt.AWTFrameGrab;
public static boolean generatePreviewImage(String filePath, String previewFileName ) throws IOException, JCodecException {
boolean isPreviewGenerated = false;
try {
double sec = 1;
BufferedImage dst = AWTFrameGrab.getFrame(new File(filePath), sec);
ImageIO.write(dst, "jpg", new File(previewFileName));
isPreviewGenerated = true;
//where filePath is the path of video file and previeFileName is the name of preview image file.
} catch(Exception e) {
System.out.println("Exception while creating video thumbnail : "+previewFileName+" - exception - "+e);
e.printStackTrace();
}
System.out.println("Image written successfully? "+previewFileName);
return isPreviewGenerated;
}
Thanks!
Upvotes: 1
Reputation: 279
Check this code, as it successfully creates the file. Have made a few changes.This is the solution for Issue1. If you are unable to see the logs, then the issue is with the logger. You can paste the logger you are using or google the issue with your logger.
public static boolean generatePreviewImage(String filePath,
String previewFileName) throws IOException, Exception {
logger.info("Request received to generate thumbnail for video. VideoFilePath : "
+ filePath + ", resultFileName " + previewFileName);
boolean isPreviewGenerated = false;
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath);
logger.info("FrameGrabber found " + grabber);
grabber.start();
logger.info("FrameGrabber started.. " + grabber);
for (int i = 20; i < 22; i++) {
logger.info("Reading first 2 images..");
ImageIO.write(grabber.grab().getBufferedImage(), "jpg", new File(
previewFileName + "_" + i));
logger.info(i + " image written successfully as " + previewFileName
+ "_" + i + ".jpg");
isPreviewGenerated = true;
}
grabber.stop();
logger.info("Is preview generated.." + isPreviewGenerated);
return isPreviewGenerated;
}
Upvotes: 2