看了好多处理视频的框架 比如ffmpeg,很多都需要依赖安装第三方插件,比较麻烦,找到一个内嵌进去不需要额外安装的:jcodec
一 首先代码中添加依赖
java
<!--视频生成预览图用-->
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec-javase</artifactId>
<version>0.2.3</version>
</dependency>
二 截取业务逻辑代码编写
生成的预览图你可以输出到一个地址,这里我是转换成了base64,然后存储到了数据库中,前台拿到也可以直接用。
java
/**
* 截取图片第一帧作为预览图
*
* @param path
* @param suffix
* @return
*/
private String generatorPreviewImg(String path,String suffix){
ByteArrayInputStream byteArrayInputStream;
try {
File videoFile = new File(path);
// 获取视频的第一帧作为预览图
Picture frame = FrameGrab.getFrameFromFile(videoFile, 1);
// 将视频帧转换为BufferedImage
BufferedImage image = AWTUtil.toBufferedImage(frame);
// 生成的预览图
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
}catch (IOException | JCodecException e){
throw new RuntimeException(e);
}
return getBase64(byteArrayInputStream,suffix);
}
java
/**
* 将图片转为base64
*
* @param in
* @param suffix
* @return
*/
private String getBase64(InputStream in,String suffix){
// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] buffer = null;
// 读取图片字节数组
try (InputStream inputStream = in) {
buffer = new byte[inputStream.available()];
inputStream.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
String base64 = Base64.encodeBase64String(buffer);
// 拼接前面的格式 data:image/jpeg;base64,/9j/4AAQSkxxxxxxx
return "data:image/" + suffix + ";base64," + base64;
}