2012-08-04 109 views
6

我想對以.mp4格式存儲的視頻進行一些圖像分析。因此,我需要一種方法來獲取這部電影的Java圖像。 我用了很多東西,發現了一些類似jcodec和jaad的庫。但我無法得到這些庫運行的東西。正如我發現的,有些例子(至少我沒有發現)顯示我的用例。如何在Java中獲取mp4電影的單張圖像

你能幫我嗎?你知道任何可以做我所需要的並且至少在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 但是這是不工作(有可編譯的錯誤)與可下載的jar包。

感謝您的幫助!

+0

可以在我更新的問題,任何人的幫助? – andy 2012-08-07 05:48:53

回答

3

,你可以在followinf程序我從視頻中提取幀使用jcodec(http://jcodec.org/)。

/* 
* 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 2013-10-14 10:07:51

+0

您使用的是什麼IDE,我使用了Netbeans,然後導入了jcodec庫(外部JAR /庫導入選項)。導入後它應該工作。 – 2013-12-13 03:49:20

+0

也照顧for循環,在上面的例子中,視頻有超過57幀。所以假設for循環是安全的。修改您的用例。 – 2013-12-13 04:10:35

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視頻。 – 2015-03-20 04:06:42