簡體   English   中英

如何從 Java 中的視頻中提取所有幀?

[英]How do I extract all the frames from a video in Java?

我正在嘗試從視頻中抓取幀並將它們放入 BufferedImage 集合中,以便稍后使用這些圖像。 我嘗試使用這個問題的第二個答案中的代碼,但這並不是很有幫助,因為他們提供的代碼只抓取了第一幀。 我將如何提取所有幀並將它們放入集合中?

因此,通過一些谷歌搜索(並閱讀源代碼),我是否能夠將這個基本概念拼湊在一起。

“明顯”的解決方案是循環播放視頻中的幀並提取它們,“不明顯”的解決方案是“如何”?!

您需要的兩種方法是FFmpegFrameGrabber#getLengthInFramesFFmpegFrameGrabber#setFrameNumber ,從那里它只是一種轉換當前幀並將其寫入文件的簡單方法(已經在上一個問題中進行了演示)

File videoFile = new File("Storm - 106630.mp4");
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(videoFile.getAbsoluteFile());
frameGrabber.start();
Java2DFrameConverter c = new Java2DFrameConverter();
int frameCount = frameGrabber.getLengthInFrames();
for (int frameNumber = 0; frameNumber < frameCount; frameNumber++) {
    System.out.println("Extracting " + String.format("%04d", frameNumber) + " of " + String.format("%04d", frameCount) + " frames");
    frameGrabber.setFrameNumber(frameNumber);
    Frame f = frameGrabber.grab();
    BufferedImage bi = c.convert(f);
    ImageIO.write(bi, "png", new File("Frame " + String.format("%04d", frameNumber) + "-" + String.format("%04d", frameCount) + ".png"));
}
frameGrabber.stop();

現在,顯然,您可以將圖像存儲到內存中的某種List中,請注意,根據原始視頻的大小和長度,這可能會使您遇到內存問題。

您可以使用 OpenCV 提取視頻中的幀,試試下面的代碼。 input是你電腦的視頻文件路徑

 VideoCapture cap = new VideoCapture();

    String output = "resources/output";

    cap.open(input);

    int video_length = (int) cap.get(Videoio.CAP_PROP_FRAME_COUNT);
    int frames_per_second = (int) cap.get(Videoio.CAP_PROP_FPS);

    Mat frame = new Mat();

    if (cap.isOpened()) {

        System.out.println("Video is opened");
        System.out.println("Number of Frames: " + video_length);
        System.out.println(frames_per_second + " Frames per Second");

        System.out.println("Converting Video to images...");

        cap.read(frame);

        int frame_number = 0;

        while (cap.read(frame)) {
            Imgcodecs.imwrite(output + "/" + frame_number + ".jpg", frame);
            frame_number++;
        }

        cap.release();

        processingStatus = video_length + " Frames extracted";
        System.out.println(processingStatus);

    } else {
        processingStatus = "Failed";
        System.out.println(processingStatus);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM