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

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

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

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


/**
 * @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<BladeFile> file = ossClient.putFileInputStearm(multipartFile);
				//保存文件地址
				media.setThumbnail(file.getData().getLink());
				log.info("第一帧缩略图保存成功!");
			} catch (Exception e) {
				throw new ServiceException("第一帧缩略图保存失败");
			}

后来维护部署时发现引入的依赖比较大。打包也特别慢。
 <dependency>-->
            <groupId>org.bytedeco</groupId>-->
            <artifactId>javacpp</artifactId>-->
            <version>1.4.1</version>-->
        </dependency>-->
        <dependency>-->
            <groupId>org.bytedeco</groupId>-->
            <artifactId>javacv</artifactId>-->
            <version>1.4.1</version>-->
        </dependency>-->

可根据自己项目实际情况更换相应的依赖。

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值