使用文件上传控件上传视频后在电脑浏览器上使用video标签可以显示视频的封面,但是在手机浏览器和微信浏览器上看不到封面。
在网上找了半天,发现有几种方式可以实现,在此做下记录:
第一种是用ffmpeg工具,不过还得安装客户端软件,于是放弃了;
第二种是javacv开源工具;
第三种是jcodec开源工具;
在此我是使用jcodec+javacv实现的完整的获取上传视频的第一帧作为封面图片,并且解决移动端上传视频获取封面第一帧图片旋转问题。
1、引入jcodec依赖
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.4</version>
</dependency>
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec-javase</artifactId>
<version>0.2.4</version>
<exclusions>
<exclusion>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
</exclusion>
</exclusions>
</dependency>
2、引入javacv依赖,需要注意该依赖东西有点多,可以根据需要选择依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.3.1</version>
</dependency>
3、详细代码如下:
//使用jcodec获取视频第一帧封面
String fullPath = "C:/webapp/video/test.mp4";
Picture picture = FrameGrab.getFrameFromFile(new File(fullPath), 0);
if (picture != null) {
String videoImg="c:/webapp/video/test_videoImg.jpg";
BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
//使用javacv判断视频是否有旋转元素,如果有需要处理
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(fullPath);
ff.start();
String rotate =ff.getVideoMetadata("rotate");
// 获取旋转角度
if(!"".equals(rotate)&&rotate!=null){
int rotation = Integer.parseInt(rotate);
BufferedImage rotatedImage = new BufferedImage(bufferedImage.getHeight(), bufferedImage.getWidth(), bufferedImage.getType());
Graphics2D g2d = rotatedImage.createGraphics();
g2d.translate((rotatedImage.getWidth() - bufferedImage.getWidth()) / 2, (rotatedImage.getHeight() - bufferedImage.getHeight()) / 2);
g2d.rotate(Math.toRadians(rotation), bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
g2d.drawImage(bufferedImage, 0, 0, null);
g2d.dispose();
ImageIO.write(rotatedImage, "jpg", new File(videoImg));
}else{
ImageIO.write(bufferedImage, "jpg", new File(videoImg));
}
}