java 代码上传视频截取某一帧缩略图
我们不是专业做图片链接处理的,只需要一个截取功能,没必要搞得那么花哨,用这个可以满足
package com.leshu.framework.util;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
public class CreateImage {
/**
* 获取指定视频的帧并保存为图片至指定目录
* [url=home.php?mod=space&uid=952169]@Param[/url] videofile 源视频文件路径
*
* @param framefile 截取帧的图片存放路径
* @throws Exception
*/
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 middleFrame = lenght / 2;
int i = 0;
Frame f = null;
while (i < lenght) {
// 获取中间帧数得图片,避免出现全黑的图片,依自己情况而定
f = ff.grabFrame();
if ((i > middleFrame) && (f.image != null)) {
break;
}
i++;
}
opencv_core.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);
ImageIO.write(bi, "jpg", targetFile);
//ff.flush();
ff.stop();
System.out.println(System.currentTimeMillis() - start);
}
public static void main(String[] args) {
try {
CreateImage.fetchFrame("C:\\Users\\leshu\\Downloads\\1627019737729.mp4", "C:\\Users\\leshu\\Downloads\\test.jpg");
} catch (Exception e) {
e.printStackTrace();
}
}
}
<!--缩略图依赖-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>0.8</version>
</dependency>
另外网上找到得一个也很有意思 ,感觉出处都是一样的。
2021/7/28 最后我用了这个,
上面的那个在linux下疯狂报错,应该是依赖没有的问题,到最后也没排查出来,直接换这个一步到位,浪费时间
it's my turn to fuck you

浙公网安备 33010602011771号