一蓑烟雨 发表于 2020-11-24 15:47

如何使用java提取视频缩略图或某一帧的图片

有个项目用到,需要上传视频,并提取一针图片.

百度大法后整理如下.

依赖使用maven

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

代码如下

public class CreateImage {




    /**
   * 获取指定视频的帧并保存为图片至指定目录
   * @Param videofile源视频文件路径
   * @param framefile截取帧的图片存放路径
   * @throws Exception
   */
    public static void fetchFrame(String videofile, String framefile)
            throws Exception {
      long start = System.currentTimeMillis();
      File targetFile = new File(framefile);
      FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
      ff.start();
      int lenght = ff.getLengthInFrames();
      int i = 0;
      Frame f = null;
      while (i < lenght) {
            // 过滤前5帧,避免出现全黑的图片,依自己情况而定
            f = ff.grabFrame();
            if ((i > 5) && (f.image != null)) {
                break;
            }
            i++;
      }
      opencv_core.IplImage img = f.image;
      int owidth = img.width();
      int oheight = img.height();
      // 对截取的帧进行等比例缩放
      int width = 800;
      int height = (int) (((double) width / owidth) * oheight);
      BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
      bi.getGraphics().drawImage(f.image.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);
      ImageIO.write(bi, "jpg", targetFile);
      //ff.flush();
      ff.stop();
      System.out.println(System.currentTimeMillis() - start);
    }




    public static void main(String[] args) {
      try {
            CreateImage.fetchFrame("D:\\1.mp4", "D:\\test5.jpg");
      } catch (Exception e) {
            e.printStackTrace();
      }
    }
}

wzj_cqbs 发表于 2020-11-24 16:16

我还是小白,暂时还看不太懂,谢谢楼主分享。

春在说谎 发表于 2020-11-24 17:08

有那种转换H265格式的视频代码吗?

白天不懂夜的嗨 发表于 2020-12-28 10:21

也只可以使用ffmpeg

yuechenxing 发表于 2020-12-28 16:24

任何语言都是ffmpeg
页: [1]
查看完整版本: 如何使用java提取视频缩略图或某一帧的图片