2012-08-04 3 views
6

.mp4 형식으로 저장된 비디오에 대한 이미지 분석을하고 싶습니다. 따라서 Java에서이 영화의 이미지를 얻는 방법이 필요합니다. jcodec과 jaad와 같은 라이브러리를 많이 발견했습니다. 그러나 나는이 라이브러리들로 달리기를 할 수 없었다. 그리고 내가 알게 되듯이, 나의 유스 케이스를 보여준 사례들 (적어도 나는 아무것도 발견하지 못했습니다)이있었습니다.Java에서 mp4-movie의 단일 이미지를 얻는 방법

도와 주시겠습니까? 적어도 Win7 64 비트에서 필요로하는 것을 수행 할 수있는 라이브러리를 알고 있습니까? 또는 jcodec을 사용하여이를 수행하는 방법을 알고 있습니까?

고마워 + 안부, 앤디

편집 : 내가 쓴 것처럼

, 나는 jcodec 그것을 시도했다. 프레임의 데이터를 가져 오는 방법을 알았지 만 BufferedImage와 같은 것으로 가져올 수있는 방법이 아닙니다. 나는이 데이터가 간단한 RGB 포맷이 아니라 압축 된 형식으로 존재할 것으로 기대한다. (나는 맞습니까?)이 데이터를 해독할지 모르겠습니다. ( http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 하지만이 작동하지 않습니다 :

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을 발견

(적어도 지금까지 내가 이것을 이해) 다음과 같이 jcodec와 프레임의 데이터를 얻을 수 있습니다 컴파일 오류가 있음).

도움 주셔서 감사합니다.

+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 비디오의 첫 번째 프레임을 제공합니다. –

관련 문제