2012-08-04 22 views
6

Tôi muốn thực hiện một số phân tích hình ảnh về video được lưu trữ ở định dạng .mp4. Vì vậy, tôi cần một cách để có được những hình ảnh của bộ phim này trong Java. Tôi goolged rất nhiều và tìm thấy một số thư viện như jcodec và jaad. NHƯNG Tôi đã không thể có được những điều đang chạy với các thư viện này. Và như tôi đã phát hiện ra, có những ví dụ (ít nhất là tôi thấy không có) cho thấy usecase của tôi.Cách lấy các hình ảnh đơn lẻ của một phim mp4 trong Java

Bạn có thể giúp tôi không? Bạn có biết bất kỳ thư viện có thể làm những gì tôi cần và đang chạy ít nhất là trên Win7 64 bit. Hoặc bạn có biết cách thực hiện điều này với jcodec không?

Thanks a lot + Trân trọng, andy

chỉnh sửa:

Như tôi đã viết, tôi đã thử nó với jcodec. Tôi phát hiện ra làm thế nào để có được dữ liệu của một khung, nhưng không phải làm thế nào tôi có thể nhận được nó vào một cái gì đó giống như một BufferedImage hay như vậy. Tôi hy vọng rằng những dữ liệu này không phải là trong một định dạng RGB đơn giản nhưng trong bất kỳ định dạng nén hoặc như vậy. (Tôi có đúng với điều đó không?) Tôi không biết giải mã dữ liệu này.

Bạn có thể lấy dữ liệu của một khung với jcodec như sau (ít nhất là như xa như tôi hiểu được điều này):

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

tôi cũng tìm thấy follwing: http://code.google.com/p/jcodec/source/browse/trunk/src/test/java/org/jcodec/containers/mp4/DitherTest.java?r=70 Nhưng điều này không làm việc (có lỗi biên dịch) với gói jar có thể tải xuống.

Cảm ơn sự giúp đỡ của bạn!

+0

Can bất cứ ai giúp đỡ về câu hỏi được cập nhật của tôi? – andy

Trả lời

0

Liên kết này có thể cung cấp cho bạn một số ý tưởng cơ bản về cách thực hiện. Hãy thử điều này ..

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

+0

xin lỗi vì tôi quên nói: Tôi có một hệ thống 64 bit và JMF không thực sự làm việc trên 64 bit ... – andy

+0

thì bạn cần phải làm một số công việc trên chính mình với sự giúp đỡ này. –

3

bạn có thể sử dụng jcodec (http://jcodec.org/) trong chương trình followinf tôi đang chiết xuất khung hình từ video.

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

Nếu tôi sử dụng mã này tôi nhận được ArrayIndexOutOfBoundsException. Ai đó có thể kiểm tra dấu vết ngăn xếp của tôi? http://pastebin.com/YQVVH559 – Matt

+0

Bạn đang sử dụng IDE nào ?, tôi đã sử dụng Netbeans và sau đó nhập thư viện jcodec (tùy chọn nhập JAR/Thư viện bên ngoài). Sau khi nhập, nó sẽ hoạt động. –

+0

Cũng chăm sóc vòng lặp for, trong ví dụ trên video có hơn 57 khung hình. Vì vậy, nó là an toàn để giả định rằng cho vòng lặp. Sửa đổi cho trường hợp sử dụng của bạn. –

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

Chương trình này sẽ cung cấp cho bạn khung 1 của video mp4. –

Các vấn đề liên quan