maven
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.3.1</version> </dependency>VideoUtil
import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class VideoUtil { private VideoUtil() { } public static void fetchFrame(String videofile, String framefile) throws Exception { long start = System.currentTimeMillis(); File targetFile = new File(framefile); FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile); ff.start(); int lenght = ff.getLengthInFrames(); int i = 0; Frame f = null; while (i < lenght) { // 过滤前5帧,避免出现全黑的图片,依自己情况而定 f = ff.grabFrame(); if ((i > 48) && (f.image != null)) { break; } i++; } int owidth = f.imageWidth; int oheight = f.imageHeight; // 对截取的帧进行等比例缩放 int width = 300; int height = (int) (((double) width / owidth) * oheight); Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage fecthedImage = converter.getBufferedImage(f); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); ImageIO.write(bi, "jpg", targetFile); ff.stop(); System.out.println("截取用时:" + (System.currentTimeMillis() - start) + " 毫秒"); } }测试类
@org.junit.Test public void test1() { try { VideoUtil.fetchFrame("D:\\work\\LgzWorkDir\\temp\\video\\封神演义-01.mkv" ,"D:\\work\\LgzWorkDir\\temp\\video\\test3.jpg"); } catch (Exception e) { e.printStackTrace(); } }