一、需求背景

   需要从上传视频中截取某一帧作为文件的封面图(缩略图)

 

二、引入jar

   1.maven下引入

      <!--start:视频获取某一帧的图片-->

      <dependency>
         <groupId>org.bytedeco</groupId>
         <artifactId>javacv</artifactId>
         <version>1.4.3</version>
      </dependency>

      <dependency>
         <groupId>org.bytedeco.javacpp-presets</groupId>
         <artifactId>ffmpeg-platform</artifactId>
         <version>4.0.2-1.4.3</version>
      </dependency>
      <!--end:视频获取某一帧的图片-->
   2.gradle下引入

   /*start:视频获取某一帧的图片*/
grab_video_1 = ["org.bytedeco:javacv:1.4.3"]
grab_video_2 = ["org.bytedeco.javacpp-presets:ffmpeg-platform:4.0.2-1.4.3"]
/*end:视频获取某一帧的图片*/
   dependencies{
      compile grab_video_1,grab_video_2
   }

三、工具类
1.导包
      import org.bytedeco.javacv.FFmpegFrameGrabber;
      import org.bytedeco.javacv.Frame;
      import org.bytedeco.javacv.Java2DFrameConverter;
      import javax.imageio.ImageIO;
      import java.awt.image.BufferedImage;
      import java.util.UUID;
      import java.io.File;
2.代码
    /**
    * 提取图片:指定帧
    *
    * @param filePath 视频文件地址
    * @param tempPath 临时文件地址
    */
    public String grabImg(String filePath, String tempPath) {

    if (StringUtils.isBlank(filePath)) {
    return null;
    }

    File tempFile = new File(filePath);
    if (!tempFile.exists()) {
    return null;
    }

    //最后获取到的缩略图的路径
    String appointFramePicture = "";
    //Frame对象
    Frame frame = null;
    //标识:第几帧
    int flag = 0;

    try {
    //获取视频文件
    FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(filePath);
    fFmpegFrameGrabber.start();

    //获取视频总帧数
    int ftp = fFmpegFrameGrabber.getLengthInFrames();

    while (flag <= ftp) {
    frame = fFmpegFrameGrabber.grabImage();

    //对视频第五帧进行处理
    if (frame!=null && flag==5) {
    //图片文件路径
    appointFramePicture = tempPath + File.separator + UUID.randomUUID().toString() + "_" + String.valueOf(flag) + ".jpg";

    //文件存储对象
    File outPut = new File(appointFramePicture);
    ImageIO.write(frameToBufferedImage(frame), "jpg", outPut);

    break;
    }
    flag++;
    }
    fFmpegFrameGrabber.stop();
    fFmpegFrameGrabber.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return appointFramePicture;
    }

    public static BufferedImage frameToBufferedImage(Frame frame) {
    //创建BufferedImage对象
    Java2DFrameConverter converter = new Java2DFrameConverter();
    BufferedImage bufferedImage = converter.getBufferedImage(frame);
    return bufferedImage;
    }