java获取上传视频第一帧作为封面

使用文件上传控件上传视频后在电脑浏览器上使用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));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值