获取视频的第一帧作为预览图
获取视频的第一帧作为预览图
在项目中有一个功能,需要获取上传素材的第一帧作为缩略图,并将截取的缩略图上传到文件服务器中。
首先我写另一个工具类用于截取视频的第一帧图片的文件流。
/**
- @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