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

ビデオからフレームを抽出している次のプログラムで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 に答える