2012-08-04 36 views
6

Quiero hacer un análisis de imagen en un video que está almacenado en formato .mp4. Por lo tanto, necesito una forma de obtener las imágenes de esta película en Java. Goolged mucho y encontré algunas bibliotecas como jcodec y jaad. PERO no pude hacer funcionar las cosas con estas bibliotecas. Y como descubrí, había ejemplos (al menos no encontré ninguno) que mostraban mi uso.Cómo obtener las imágenes individuales de una película mp4 en Java

¿Me puede ayudar? ¿Conoces alguna biblioteca que pueda hacer lo que necesito y que se ejecuta al menos en Win7 64 bit? ¿O sabes cómo lograr esto con jcodec?

Muchas gracias + saludos cordiales, Andy

edición:

Como he escrito, he probado con jcodec. Descubrí cómo obtener los datos de un marco, pero no cómo puedo obtener algo así como una Imagen Buffered más o menos. Espero que estos datos no estén en un formato RGB simple, sino en cualquier formato comprimido. (¿Estoy en lo cierto con eso?) No sé decodificar esta información.

Usted puede obtener los datos de un marco con jcodec de la siguiente manera (al menos por lo que yo entiendo):

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

También encontré la siguientes aparatos: http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 Pero esto no está funcionando (tiene errores de compilación) con el paquete jar descargable.

Gracias por su ayuda!

+0

Puede alguien ayuda en mi pregunta actualizado? – andy

Respuesta

3

podría utilizar jcodec (http://jcodec.org/) en el programa followinf estoy extracción de fotogramas de un vídeo.

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

Si uso este código, obtengo ArrayIndexOutOfBoundsException. ¿Alguien podría verificar mi rastro de pila? http://pastebin.com/YQVVH559 – Matt

+0

¿Qué IDE estás usando? Utilicé Netbeans y luego importé la biblioteca de jcodec (opción de importación de JAR externo/biblioteca). Después de importar, debería funcionar. –

+0

También cuide el bucle for, en el ejemplo anterior, el video tenía más de 57 fotogramas. Por lo tanto, era seguro asumir eso para loop. Modificar para su caso de uso. –

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

Este programa le dará el primer fotograma de video mp4. –

Cuestiones relacionadas