依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>
传入视频流获取图片byte
private byte[] getCoverImageBytes(Integer frameNumber, String vName, byte[] videoBytes) {
Double videoSize = DoubleUtil.getDouble2(videoBytes.length / 1024.0 / 1024.0);
long timeMillis = System.currentTimeMillis();
logger.info("截取视频截图开始 视频名称:{} 视频大小:{}MB", vName, videoSize);
try (ByteArrayInputStream is = new ByteArrayInputStream(videoBytes);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Java2DFrameConverter converter = new Java2DFrameConverter()) {
grabber.start();
int ftp = grabber.getLengthInFrames() - 10;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
grabber.setFrameNumber(frameNumber);
Frame frame = grabber.grabImage();
BufferedImage bi = converter.getBufferedImage(frame);
ImageIO.write(bi, "jpg", os);
grabber.stop();
logger.info("截取视频截图结束,处理时间: {}秒", (System.currentTimeMillis() - timeMillis) / 1000);
return os.toByteArray();
} catch (FrameGrabber.Exception e) {
logger.error("FrameGrabber.Exception :{}", e.getMessage());
} catch (IOException e) {
logger.error("IOException :{}", e.getMessage());
}
logger.info("获取视频封面图失败 vName:{}", vName);
return null;
}
传入视频流获取图片文件
private void coverImage(Integer frameNumber, File file) {
String vName = file.getName();
Double videoSize = DoubleUtil.getDouble2(file.length() / 1024.0 / 1024.0);
long timeMillis = System.currentTimeMillis();
logger.info("截取视频截图开始 视频名称:{} 视频大小:{}MB", vName, videoSize);
try (FileInputStream is = new FileInputStream(file);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(is);
Java2DFrameConverter converter = new Java2DFrameConverter()) {
grabber.start();
int ftp = grabber.getLengthInFrames() - 10;
frameNumber = ftp < frameNumber ? ftp : frameNumber;
grabber.setFrameNumber(frameNumber);
String targetFileName = vName.substring(0, vName.lastIndexOf(".")) + "_vc.jpg";
logger.info("图片名称:{}", targetFileName);
File imageFile = new File("D:\\my_work\\" + targetFileName);
Frame frame = grabber.grabImage();
BufferedImage bi = converter.getBufferedImage(frame);
ImageIO.write(bi, "jpg", imageFile);
grabber.stop();
logger.info("截取视频截图结束,处理时间: {}秒", (System.currentTimeMillis() - timeMillis) / 1000);
} catch (FrameGrabber.Exception e) {
logger.error("FrameGrabber.Exception :{}", e.getMessage());
} catch (IOException e) {
logger.error("IOException :{}", e.getMessage());
}