Java处理图片和视频文件——视频抽帧与图片压缩

一、简介

环境:SpringBoot 2.2.2.RELEASEJava8Maven
pom依赖:thumbnailator(处理图片)、javacv-platform(处理视频)

二、实现

2.1 依赖

 <!--图片压缩-->
 <dependency>
      <groupId>net.coobird</groupId>
      <artifactId>thumbnailator</artifactId>
      <version>0.4.8</version>
  </dependency>
  <!--视频处理 截取视频缩略图 -->
  <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacv-platform</artifactId>
      <version>1.3.1</version>
  </dependency>

2.2 视频抽帧(截取封面)

//创建FFmpegFrameGrabber 对象
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(videoPath);
ff.start();
 int ffLength = ff.getLengthInFrames();
 Frame f;
 int i = 0;
 while (i < ffLength) {
     f = ff.grabImage();
     //截取第6帧
     if((i>5) &&  (f.image != null)){
         //生成图片的相对路径 例如:pic/uuid.png
         pngPath =  "来电名片mp4_缩略图"+".png";
         //执行截图并放入指定位置
         doExecuteFrame(f, dir+pngPath);
         break;
     }
     i++;
 }
 ff.stop();
 /**
  * 截取缩略图
  * @param f Frame
  * @param targerFilePath:封面图片存放路径
  */
 private static void doExecuteFrame(Frame f, String targerFilePath) {
     String imagemat = "png";
     if (null == f || null == f.image) {
         return;
     }
     Java2DFrameConverter converter = new Java2DFrameConverter();
     BufferedImage bi = converter.getBufferedImage(f);
     File output = new File(targerFilePath);
     try {
         ImageIO.write(bi, imagemat, output);
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

2.3 图片压缩

Thumbnails.of(new File("/Users/LiuShihao/IdeaProjects/besttone-newmsg-5g/files/Beijing.png"))
		//图片大小(长宽)压缩比例 从0-1,1表示原图
        .scale(0.3f) 
        //图片质量压缩比例 从0-1,越接近1质量越好
        .outputQuality(0.3f) 
        .toOutputStream(new FileOutputStream("/Users/LiuShihao/IdeaProjects/besttone-newmsg-5g/files/showqrcode_50.jpg"));
System.out.println("完成");

三、源码

package com.haobai;

import net.coobird.thumbnailator.Thumbnails;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author :LiuShihao
 * @date :Created in 2022/1/7 12:26 下午
 * @desc :截取视频封面并进行压缩
 */
@SpringBootTest
public class VideoTest {

    @Test
    public void test() throws IOException {
        String dir = "files/";
        String pngPath = "";
        String videoPath = "files/来电名片.mp4";
        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(videoPath);

        ff.start();
        int ffLength = ff.getLengthInFrames();
        Frame f;
        int i = 0;
        while (i < ffLength) {
            f = ff.grabImage();
            //截取第6帧
            if((i>5) &&  (f.image != null)){
                //生成图片的相对路径 例如:pic/uuid.png
                pngPath =  "来电名片mp4_缩略图"+".png";
                //执行截图并放入指定位置
                doExecuteFrame(f, dir+pngPath);
                break;
            }
            i++;
        }
        ff.stop();


        //压缩视频缩略图
        Thumbnails.of(new File(dir+pngPath))
                .scale(0.5f) //图片大小(长宽)压缩比例 从0-1,1表示原图
                .outputQuality(0.1f) //图片质量压缩比例 从0-1,越接近1质量越好
                .toOutputStream(new FileOutputStream("files/来电名片mp4压缩后缩略图.png"));

        System.out.println("=============完成=============");

    }

    /**
     * 截取缩略图
     * @param f Frame
     * @param targerFilePath:封面图片存放路径
     */
    private static void doExecuteFrame(Frame f, String targerFilePath) {
        String imagemat = "png";
        if (null == f || null == f.image) {
            return;
        }
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bi = converter.getBufferedImage(f);
        File output = new File(targerFilePath);
        try {
            ImageIO.write(bi, imagemat, output);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值