2012-08-04 11 views
6

.mp4形式で保存されたビデオについて、いくつかのイメージ分析を行いたいとします。したがって、私はJavaでこの映画の画像を取得する方法が必要です。 私はたくさんのことを見つけ、jcodecやjaadのようなライブラリを見つけました。しかし、私はこれらのライブラリで動作するものを得ることができませんでした。私が知ったように、私のユースケースを示した例がありました(少なくとも私には何も見つかりませんでした)。Javaでmp4ムービーの1つのイメージを取得する方法

私を助けることができますか?あなたが必要としていることを実行でき、少なくとも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(); 
} 

私もfollwingが見つかりました: http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 しかし、これは動作しません(コンパイルエラーが発生しています)。

ありがとうございました!

+0

誰もが私の更新の質問に助けることができますか? – andy

答えて

0

このリンクからは、基本的な考え方が分かるかもしれません。これを試してみてください。..

http://krishnabhargav.blogspot.in/2008/02/processing-videos-in-java.html

+0

私は言うことを忘れて申し訳ありません:私は64ビットシステムを持っており、JMFは実際には64ビットで動作しません... – andy

+0

あなたはこのヘルプを自分でいくつかの作業を行う必要があります。 –

3

私はビデオからフレームを抽出していますfollowinfプログラムで(http://jcodec.org/)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"); 
    } 
} 
+0

このコードを使用すると、ArrayIndexOutOfBoundsExceptionが発生します。誰かが私のスタックトレースをチェックできますか? http://pastebin.com/YQVVH559 – Matt

+0

どのIDEを使用していますか?Netbeansを使用してjcodecライブラリ(外部JAR /ライブラリインポートオプション)をインポートしました。インポート後、動作するはずです。 –

+0

また、上記の例ではforループが処理され、ビデオは57フレーム以上ありました。だから、forループと仮定するのは安全だった。ユースケースを変更します。 –

1
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(); 
     } 


    } 
} 
+0

このプログラムは、あなたにmp4ビデオの最初のフレームを与えます。 –

関連する問題