2012-08-04 10 views
6

Ich möchte eine Bildanalyse für ein Video durchführen, das im .mp4-Format gespeichert ist. Daher brauche ich einen Weg, um die Bilder dieses Films in Java zu bekommen. Ich habe viel gegoogged und einige Bibliotheken wie Jcodec und Jaad gefunden. ABER ich war nicht in der Lage, die Dinge mit diesen Bibliotheken laufen zu lassen. Und als ich herausfand, gab es Beispiele (zumindest fand ich keine), die meinen Anwendungsfall zeigten.So erhalten Sie die Einzelbilder eines mp4-Films in Java

Können Sie mir helfen? Kennst du irgendeine Bibliothek, die tun kann, was ich brauche und mindestens auf Win7 64 bit läuft? Oder wissen Sie, wie dies mit Jcodec zu erreichen?

Vielen Dank + freundlichen Grüßen andy

edit:

Wie ich schrieb versuchte ich es mit jcodec. Ich habe herausgefunden, wie man die Daten eines Frames bekommt, aber nicht, wie ich es in eine Art BufferedImage bringen kann. Ich erwarte, dass diese Daten nicht in einem einfachen RGB-Format vorliegen, sondern in irgendeinem komprimierten Format oder so. (Habe ich recht damit?) Ich weiß nicht, um diese Daten zu entschlüsseln.

Sie können die Daten eines Rahmens mit jcodec erhalten wie folgt (zumindest soweit ich das verstehen):

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

Ich fand auch die follwing: http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 Aber das funktioniert nicht (hat Kompilierfehler) mit dem herunterladbaren Jar-Paket.

Danke für Ihre Hilfe!

+0

Kann jemand Hilfe auf meine Frage aktualisiert? – andy

Antwort

0

Dieser Link gibt Ihnen möglicherweise eine grundlegende Vorstellung davon, wie Sie vorgehen sollen. Versuchen Sie dies ..

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

+0

Entschuldigung, dass ich vergessen habe zu sagen: Ich habe ein 64-Bit-System und die JMF funktioniert nicht wirklich auf 64-Bit ... – andy

+0

dann müssen Sie etwas Arbeit an sich selbst mit dieser Hilfe tun. –

3

könnten Sie jcodec (http://jcodec.org/) im followinf Programm i-Frames aus einem Video am extrahieren.

/* 
* 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

Wenn ich diesen Code verwende, bekomme ich ArrayIndexOutOfBoundsException. Könnte jemand meinen Stack-Trace überprüfen? http://pastebin.com/YQVVH559 – Matt

+0

Welche IDE verwenden Sie?, Ich habe Netbeans und dann importiert die Jcodec-Bibliothek (Externe JAR/Library-Import-Option). Nach dem Import sollte es funktionieren. –

+0

Achte auch auf die for-Schleife, im obigen Beispiel hatte das Video mehr als 57 Frames. Es war also sicher, diese For-Schleife anzunehmen. Ändern Sie für Ihren Anwendungsfall. –

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

Dieses Programm gibt Ihnen den ersten Frame von mp4 Video. –

Verwandte Themen