如何在Java中获取mp4电影的单个图像

8
我想在存储为.mp4格式的视频上进行一些图像分析。因此,我需要一种在Java中只获取这部电影的图像的方法。 我搜索了很多,并找到了一些库,如jcodec和jaad。但是我无法使用这些库运行程序。并且,据我所知,没有示例(至少我没有找到)可以展示我的用例。
你能帮帮我吗?你知道任何可以满足我的需求并且至少在Win7 64位上运行的库吗? 或者你知道如何使用jcodec完成这个任务吗?
编辑:
正如我所写的,我已经尝试过jcodec。我发现如何获取帧的数据,但不知道如何将其转换成类似于BufferedImage之类的格式。我预计这些数据不是简单的RGB格式,而是任何压缩格式之类的东西。(我是对的吗?)我不知道如何解码这些数据。
你可以按照以下方式使用jcodec获取帧的数据(至少就我理解而言):
public static void main(String[] args) throws IOException, MP4DemuxerException {
    String path = "videos/video-2011-09-21-20-07-21.mp4";

    MP4Demuxer demuxer1 = new MP4Demuxer(new FileInput(new File(path)));
    DemuxerTrack videoTrack = demuxer1.getVideoTrack();

    Packet firstFrame = videoTrack.getFrames(1);
    byte[] data = firstFrame.getData();
}

我还发现了以下内容: http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 但是,这个链接不能与可下载的jar包一起使用(存在编译错误)。

有谁可以帮助我解决我的更新问题吗? - andy
2个回答

6

在我提取视频帧的程序中,您可以使用jcodec(https://github.com/jcodec/jcodec)。

/*
 * To extract frames from a mp4(avc) video
 * 
 */
package avc_frame;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.jcodec.api.FrameGrab;
import org.jcodec.api.JCodecException;

public class Avc_frame {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, JCodecException {
  
        long time = System.currentTimeMillis();
        for (int i = 50; i < 57; i++) { 
            BufferedImage frame = FrameGrab.getFrame(new File("/Users/jovi/Movies/test.mp4"), i);
            ImageIO.write(frame, "bmp", new File("/Users/jovi/Desktop/frames/frame_"+i+".bmp"));
        }
        System.out.println("Time Used:" + (System.currentTimeMillis() - time)+" Milliseconds");
    }
}

如果我使用这段代码,我会得到ArrayIndexOutOfBoundsException。有人可以检查一下我的堆栈跟踪吗?http://pastebin.com/YQVVH559 - Matt
你用的是哪个集成开发环境(IDE)?我使用的是Netbeans,然后导入了jcodec库(外部JAR /库导入选项)。导入后应该可以正常工作。 - Jovi DSilva
还要注意for循环,在上面的示例中,视频有超过57帧。因此可以安全地假定for循环。根据您的用例进行修改。 - Jovi DSilva

3
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FrameGrabber.Exception;

public class Read{
    public static void main(String []args) throws IOException, Exception
    {
        FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber("C:/Users/Digilog/Downloads/Test.mp4");
        frameGrabber.start();
        IplImage i;
        try {

            i = frameGrabber.grab();
            BufferedImage  bi = i.getBufferedImage();
            ImageIO.write(bi,"png", new File("D:/Img.png"));
            frameGrabber.stop();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

此程序将为您提供mp4视频的第一帧。 - kousik Mridha
1
如果你只需要从视频文件中获取单个帧,则使用jcodec库更好。它非常轻巧,只有大约2MB大小,而使用javacv则需要导入约400MB,因为它内部使用OpenCV。 - gadon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接