Skip to content

javacv将视频转图片

ffmpeg原生命令

bash
ffmpeg -re -i temp.mp4 -r 1 -f image2 image-%3d.jpeg

Java实现

FFmpegFrameRecorder 方式

java
  public void convert2Image() {
    avutil.av_log_set_level(avutil.AV_LOG_INFO);
    FFmpegLogCallback.set();
    int i = 0;
    // 输入文件地址 可以用文件、输入流、rtsp等协议拉取流
    try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
        grabber.start();
        // 获取视频帧率
        double frameRate = grabber.getFrameRate();
        System.out.println("frameRate = " + frameRate);
        // 转化的视频文件地址
        try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("D:\\Temp\\video\\image\\image-%3d.jpeg",
                grabber.getImageWidth(), grabber.getImageHeight())) {
            recorder.setFormat("image2");
            recorder.setFrameRate(grabber.getFrameRate());
            recorder.start();
            Frame frame;
            while ((frame = grabber.grabImage()) != null) {
                // 每十帧转换一次
                if (i % 10 == 0) {
                    recorder.recordImage(frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, frame.imageStride,
                            avutil.AV_PIX_FMT_NONE, frame.image);
                }
                i++;
            }
        }
    } catch (Exception e) {
        log.error(e.getMessage());
        throw new RuntimeException(e);
    }
}

流方式

java
   public void convert2ImageGrabber() {
    avutil.av_log_set_level(avutil.AV_LOG_INFO);
    FFmpegLogCallback.set();
    int i = 0;
    try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
        grabber.start();
        // 获取视频帧率
        double frameRate = grabber.getFrameRate();
        System.out.println("frameRate = " + frameRate);
        Frame frame;
        while ((frame = grabber.grabImage()) != null) {
            try (Java2DFrameConverter converter = new Java2DFrameConverter()) {
                BufferedImage bufferedImage = converter.convert(frame);
                String formatFile = String.format("D:\\Temp\\video\\convert\\image-%d.jpeg", i);
                File file = new File(formatFile);
                ImageIO.write(bufferedImage, "jpg", file);
            }
            i++;
        }
        System.out.println(i);
    } catch (Exception e) {
        log.error(e.getMessage());
        throw new RuntimeException(e);
    }
}

图片推送到远程

java
  public void imageGrabberTest() {
        avutil.av_log_set_level(avutil.AV_LOG_INFO);
        FFmpegLogCallback.set();
        int i = 0;
        try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("D:\\Temp\\video\\tmp.mp4")) {
            grabber.start();
            // 获取视频帧率
            double frameRate = grabber.getFrameRate();
            System.out.println("frameRate = " + frameRate);
            // 远程地址
            try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("http://localhost:12321/video/upload/image-%d.jpeg",
                    grabber.getImageWidth(), grabber.getImageHeight())) {
                recorder.setFormat("image2");
                recorder.setFrameRate(grabber.getFrameRate());
                //请求方法
                recorder.setOption("method","POST");
                recorder.start();
                Frame frame;
                while ((frame = grabber.grabImage()) != null) {
                    // 每十帧转换一次
                    if (i % 10 == 0) {
                        recorder.recordImage(frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, frame.imageStride,
                                avutil.AV_PIX_FMT_NONE, frame.image);
                    }
                    i++;
                }
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
            throw new RuntimeException(e);
        }
    }