a.
Then you need to download Jcodec 0.2.0 library source code.
b.
Compile inside directory [jcodec-master] the
project --- mvn clean install
c.
Go to location "src/main/java/org/jcodec/scale/AWTUtil.java"
-- in this class you can find utility methods which i am using below.
-- in this class you can find utility methods which i am using below.
2.
Add maven dependency
a.
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.0</version>
</dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.0</version>
</dependency>
3.
This is the sample code to extract frame from
video mp4 format
-
This works fine for me, hope this help you as
well
import org.jcodec.api.FrameGrab8Bit;
import org.jcodec.api.JCodecException;
import org.jcodec.common.model.ColorSpace;
import org.jcodec.common.model.Picture8Bit;
import org.jcodec.scale.ColorUtil;
import org.jcodec.scale.RgbToBgr8Bit;
import org.jcodec.scale.Transform8Bit;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
public class VideoFrameExtracter {
public File createThumbnailFromVideo(File file, int frameNumber) throws IOException, JCodecException {
Picture8Bit frame = FrameGrab8Bit.getFrameFromFile(file, frameNumber);
File tempFile = File.createTempFile("thumb_" + frameNumber + file.getName().replaceAll("(.+)\\..+", "$1"), ".png");
ImageIO.write(toBufferedImage8Bit(frame), "png", tempFile);
return tempFile;
}
// this method is from Jcodec AWTUtils.java.
private BufferedImage toBufferedImage8Bit(Picture8Bit src) {
if (src.getColor() != ColorSpace.RGB) {
Transform8Bit transform = ColorUtil.getTransform8Bit(src.getColor(), ColorSpace.RGB);
if (transform == null) {
throw new IllegalArgumentException("Unsupported input colorspace: " + src.getColor());
}
Picture8Bit out = Picture8Bit.create(src.getWidth(), src.getHeight(), ColorSpace.RGB);
transform.transform(src, out);
new RgbToBgr8Bit().transform(out, out);
src = out;
}
BufferedImage dst = new BufferedImage(src.getCroppedWidth(), src.getCroppedHeight(),
BufferedImage.TYPE_3BYTE_BGR);
if (src.getCrop() == null)
toBufferedImage8Bit2(src, dst);
else
toBufferedImageCropped8Bit(src, dst);
return dst;
}
// this method is from Jcodec AWTUtils.java.
private void toBufferedImage8Bit2(Picture8Bit src, BufferedImage dst) {
byte[] data = ((DataBufferByte) dst.getRaster().getDataBuffer()).getData();
byte[] srcData = src.getPlaneData(0);
for (int i = 0; i < data.length; i++) {
data[i] = (byte) (srcData[i] + 128);
}
}
// this method is from Jcodec AWTUtils.java.
private static void toBufferedImageCropped8Bit(Picture8Bit src, BufferedImage dst) {
byte[] data = ((DataBufferByte) dst.getRaster().getDataBuffer()).getData();
byte[] srcData = src.getPlaneData(0);
int dstStride = dst.getWidth() * 3;
int srcStride = src.getWidth() * 3;
for (int line = 0, srcOff = 0, dstOff = 0; line < dst.getHeight(); line++) {
for (int id = dstOff, is = srcOff; id < dstOff + dstStride; id += 3, is += 3) {
data[id] = (byte) (srcData[is] + 128);
data[id + 1] = (byte) (srcData[is + 1] + 128);
data[id + 2] = (byte) (srcData[is + 2] + 128);
}
srcOff += srcStride;
dstOff += dstStride;
}
}
public static void main(String[] args) {
VideoFrameExtracter videoFrameExtracter = new VideoFrameExtracter();
File file = Paths.get("C:\\Users\\Public\\Videos\\Sample Videos\\sample.mp4").toFile();
try {
File imageFrame = videoFrameExtracter.createThumbnailFromVideo(file, 2);
System.out.println("input file name : " + file.getAbsolutePath());
System.out.println("output video frame file name : " + imageFrame.getAbsolutePath());
} catch (IOException | JCodecException e) {
System.out.println("error occurred while extracting image : " + e.getMessage());
}
}
}