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

本文介绍了一个使用Java实现的功能,即从视频中获取第一帧作为预览图。通过FFmpegFrameGrabber获取视频帧,利用OpenCV处理旋转,然后将帧转换为InputStream,进一步转换为MultipartFile以便于文件上传到服务器。
摘要由CSDN通过智能技术生成

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

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

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

/**

@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

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值