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 包无法正常工作(存在编译错误)。

4

2 回答 2

6

您可以在 followinf 程序中使用 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");
    }
}
于 2013-08-27T06:49:40.233 回答
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();
        }


    }
}
于 2015-03-20T04:06:03.843 回答