欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

获取视频的第一帧作为预览图

程序员文章站 2022-04-15 17:45:27
获取视频的第一帧作为预览图在项目中有一个功能,需要获取上传素材的第一帧作为缩略图,并将截取的缩略图上传到文件服务器中。首先我写另一个工具类用于截取视频的第一帧图片的文件流。/**@author langzi*/@Component@Data@Slf4jpublic class FileUploadUtil {/***获取视频的第一帧图片* @param filePath 视频路径* @throws InputStream*/public static InputStre...

获取视频的第一帧作为预览图

	在项目中有一个功能,需要获取上传素材的第一帧作为缩略图,并将截取的缩略图上传到文件服务器中。

首先我写另一个工具类用于截取视频的第一帧图片的文件流。

/**

  • @author langzi
    */
    @Component
    @Data
    @Slf4j
    public class FileUploadUtil {

/**
*获取视频的第一帧图片
* @param filePath 视频路径
* @throws InputStream
*/
public static InputStream randomGrabberFFmpegImage(String filePath)
throws Exception {

	FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
	ff.start();
	String rotate =ff.getVideoMetadata("rotate");
	Frame f;
	int i = 0;
	while (i <1) {
		f =ff.grabImage();
		IplImage src = null;
		if(null !=rotate &&rotate.length() > 1) {
			OpenCVFrameConverter.ToIplImage converter =new OpenCVFrameConverter.ToIplImage();
			src =converter.convert(f);
			f =converter.convert(rotate(src, Integer.valueOf(rotate)));
		}
		return doExecuteFrame(f);

	}
	ff.stop();
	return null;
}

public static InputStream doExecuteFrame(Frame f) {
if (null ==f ||null ==f.image) {
return null;
}
Java2DFrameConverter converter =new Java2DFrameConverter();
BufferedImage bi =converter.getBufferedImage(f);
return bufferedImageToInputStream(bi);
}

/**
 * 将BufferedImage转换为InputStream
 * @param image
 * @return
 */
public static InputStream bufferedImageToInputStream(BufferedImage image){
	ByteArrayOutputStream os = new ByteArrayOutputStream();
	try {
		ImageIO.write(image, "png", os);
		InputStream input = new ByteArrayInputStream(os.toByteArray());
		return input;
	} catch (IOException e) {
		new Thread("转化失败");
	}
	return null;
}

/**
 * 将流转化为MultipartFile
 * @param fileName
 * @return
 */
public static MultipartFile inputStreamToMultipartFile(String fileName){

	DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
		MediaType.ALL_VALUE, true, fileName);

	return new CommonsMultipartFile(fileItem);
}

}

因为是微服务架构,通过feign调用文件上传服务的相关接口(统一使用minio上传文件)所以我需要将流转化为MultipartFile

try {
//获取视频的第一帧图片输出流
InputStream first = FileUploadUtil.randomGrabberFFmpegImage(media.getAddress());
//获取文件名
String fileName = address.substring(address.lastIndexOf("/"),address.lastIndexOf(".")) .concat(".jpg");
//将流转化为multipartFile
MultipartFile multipartFile = new MockMultipartFile(“file”,fileName,“image/jpg”, first);
//上传图片(通过feign)
R file = ossClient.putFileInputStearm(multipartFile);
//保存文件地址
media.setThumbnail(file.getData().getLink());
log.info(“第一帧缩略图保存成功!”);
} catch (Exception e) {
throw new ServiceException(“第一帧缩略图保存失败”);
}

新人博客,写的不好望见谅!

本文地址:https://blog.csdn.net/weixin_45457338/article/details/109570241

相关标签: java