You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中提取视频全部帧并存入BufferedImage集合?

提取视频全部帧到BufferedImage集合的解决方案

你提到的原代码仅提取第一帧,是因为它只执行了一次帧读取操作。要提取全部帧,只需要循环读取帧直到没有更多帧可用,同时将每帧转换为BufferedImage存入集合即可。以下是基于原代码改造的完整实现:

依赖说明

首先确保项目中引入JavaCV相关依赖(以Maven为例):

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.9</version>
</dependency>

完整代码实现

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

public class VideoFrameExtractor {
    public static List<BufferedImage> extractAllFrames(String videoPath) {
        List<BufferedImage> frameList = new ArrayList<>();
        FFmpegFrameGrabber grabber = null;
        Java2DFrameConverter converter = new Java2DFrameConverter();

        try {
            grabber = new FFmpegFrameGrabber(videoPath);
            grabber.start();

            Frame frame;
            // 循环读取帧,直到grabFrame返回null(表示没有更多帧)
            while ((frame = grabber.grabFrame()) != null) {
                // 只处理视频帧,忽略音频帧等其他类型
                if (frame.image != null) {
                    BufferedImage bufferedImage = converter.convert(frame);
                    frameList.add(bufferedImage);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 确保资源被正确释放
            try {
                if (grabber != null) {
                    grabber.stop();
                    grabber.release();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return frameList;
    }

    // 测试用例
    public static void main(String[] args) {
        String videoPath = "your_video_path.mp4";
        List<BufferedImage> frames = extractAllFrames(videoPath);
        System.out.println("提取到的总帧数:" + frames.size());
    }
}

关键改动说明

  • 循环读取帧:用while循环持续调用grabFrame(),直到返回null,表示视频已读取完毕。
  • 过滤有效帧:通过frame.image != null判断当前帧是视频帧,避免处理音频帧或其他非图像帧。
  • 资源释放:在finally块中确保FFmpegFrameGrabber被正确停止和释放,防止资源泄漏。

内容的提问来源于stack exchange,提问作者Anston Sorensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:10:33