java 截取视频第一帧

maven依赖
截取图片第一帧依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>0.8</version>
</dependency>

// 文件转换依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>RELEASE</version>
</dependency>
// 获取文件名称
String mp4 = file.getOriginalFilename();
String img = System.currentTimeMillis() + ".jpg";
//储存文件的路径
File file2 = new File("D:\\Download\\"+ mp4);
File file4 = new File("D:\\Download\\"+ img);

//把传入的文件写入到"D:\\Download\\"+ mp4
file.transferTo(file2);
//调用截取方法,返回写入到 "D:\\Download\\"+ img 里面的文件
File file1 = JiequImg.fetchFrame(file2,file4);
//file 文件转成 MultipartFile
FileInputStream fileInput = new FileInputStream(file1);
MultipartFile toMultipartFile = new MockMultipartFile("file",file1.getName(),"application/json;charset=UTF-8", IOUtils.toByteArray(fileInput));
toMultipartFile.getInputStream();
// 上传
String s = fastDFSClientWrapper.uploadFile(file);
//关流(没有关流删除不了文件)
fileInput.close();
//删除视频
file2.delete();
//删除第一帧图片
file1.delete();






public class JiequImg {

public static File fetchFrame(File file,File file4)
throws Exception {
long start = System.currentTimeMillis();
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
ff.start();
int lenght = ff.getLengthInFrames();
int i = 0;
Frame f = null;
while (i < lenght) {
// 过滤前5帧,避免出现全黑的图片,依自己情况而定
f = ff.grabFrame();
if ((i > 5) && (f.image != null)) {
break;
}
i++;
}
IplImage img = f.image;
int owidth = img.width();
int oheight = img.height();
// 对截取的帧进行等比例缩放
int width = 800;
int height = (int) (((double) width / owidth) * oheight);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
bi.getGraphics().drawImage(f.image.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH),
0, 0, null);
//ff.flush();
ImageIO.write(bi, "jpg", file4);
ff.stop();
return file4;
}
}

猜你喜欢

转载自www.cnblogs.com/bt2882/p/11493134.html