2015-03-19 87 views
0

我將視頻存儲在硬盤中並將其鏈接存儲在數據庫中,因爲我發現這是視頻存儲在數據庫中的解決方案。 現在我需要檢索每個video.so的縮略圖圖像我怎樣才能得到在Java中使用ffmpeg視頻(MJPEG格式)的縮略圖圖像。如何獲得縮略圖在java中的視頻(格式MJPEG)的圖像

我不知道也許我找不到合適的關鍵字。

的PS:我使用Eclipse IDE和實現的Java Swing所需的接口

+0

[視頻縮略圖的Java(http://stackoverflow.com/questions/48179/video-thumbnails-in-java) – 2015-03-19 10:58:22

+0

@NeerajJain是的,我想這樣做..但我怎樣才能得到與視頻有關的圖像..其實我需要縮略圖來表示那個視頻。 – Shaista 2015-03-19 11:00:04

+0

@NeerajJain謝謝你 – Shaista 2015-03-19 11:12:35

回答

0

您可以使用xuggle它易於使用,具有樣本這樣做。

但是,它已被棄用。您可能想要檢查謙虛的視頻。

我已經使用了xuggle,它支持大量的視頻格式。

它適用於主要操作系統,無需安裝任何東西。

在谷歌搜索。

+0

感謝您的答覆..可以請您分享代碼..這可能會幫助我.. – Shaista 2015-03-19 11:01:37

+0

@Salivan xuggle下載不起作用。你能建議任何鏈接下載? – 2016-08-31 04:18:01

0

在這裏您可以找到庫和示例代碼。但是,這取決於你想要在哪個框架上拍攝縮略圖。

玩這個代碼,找出你的需求:

/** 
* 
* @author Pasban 
*/ 
import com.xuggle.xuggler.ICodec; 
import com.xuggle.xuggler.IContainer; 
import com.xuggle.xuggler.IPacket; 
import com.xuggle.xuggler.IStream; 
import com.xuggle.xuggler.IStreamCoder; 
import com.xuggle.xuggler.IVideoPicture; 
import com.xuggle.xuggler.video.ConverterFactory; 
import com.xuggle.xuggler.video.IConverter; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class VideoThumbnail extends JDialog { 

    private Image image; 

    public static void main(String[] args) { 
     final VideoThumbnail merge = new VideoThumbnail(); 
     Thread thread = new Thread() { 

      @Override 
      public void run() { 
       merge.perform("y:/a.mp4", "y:/thumb.a.png"); 
       merge.setVisible(false); 
       System.exit(0); 
      } 
     }; 
     thread.run(); 
    } 

    public void perform(String path_video, String filename) { 

     IContainer container = IContainer.make(); 

     // check if file is readable 
     if (container.open(path_video, IContainer.Type.READ, null) < 0) { 
      throw new IllegalArgumentException("Can't find " + path_video); 
     } 

     // read video file and create stream 



     double fRate = 0; 
     IStreamCoder coderVideo = null; 

     for (int i = 0; i < container.getNumStreams(); i++) { 
      IStream stream = container.getStream(i); 
      IStreamCoder coder = stream.getStreamCoder(); 
      if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) { 
       coderVideo = coder; 
       fRate = coderVideo.getFrameRate().getDouble(); 
       break; 
      } 
     } 


     if (coderVideo == null || coderVideo.open(null, null) < 0) { 
      throw new RuntimeException("Can't open video coder"); 
     } 

     int width = coderVideo.getWidth(); 
     int height = coderVideo.getHeight(); 

     this.setSize(width, height); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 

     IPacket packet = IPacket.make(); 

     int after_this_frame = 60; // or 60 * fRate to have your time in Seconds (here it will be 60*fRate = 1mins) 
     while (container.readNextPacket(packet) >= 0) { 

      // video packet 
      IVideoPicture picture = IVideoPicture.make(coderVideo.getPixelType(), width, height); 
      coderVideo.decodeVideo(picture, packet, 0); 
      if (picture.isComplete()) { 
       IConverter converter = ConverterFactory.createConverter(ConverterFactory.XUGGLER_BGR_24, picture); 
       BufferedImage bi = converter.toImage(picture); 
       try { 
        after_this_frame--; 
        if (after_this_frame == 0) { 
         ImageIO.write(bi, "png", new File(filename)); 
         break; 
        } 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

       this.setImage(bi); 
       // break from this loop if you are happy with the first frame. 
       //break; 
      } 

     } 

     coderVideo.close(); 
     container.close(); 

    } 

    public VideoThumbnail() { 
     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

    public void setImage(final Image image) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       VideoThumbnail.this.image = image; 
       repaint(); 
      } 
     }); 
    } 

    @Override 
    public synchronized void paint(Graphics g) { 
     if (image != null) { 
      g.drawImage(image, 0, 0, null); 
     } 
    } 
} 

對於來自Xuggle更多的樣本,

https://github.com/artclarke/xuggle-xuggler/tree/master/src/com/xuggle/mediatool/demos

+0

xuggle下載不起作用。你能建議任何鏈接下載? – 2016-08-31 04:18:30

+1

我將我的舊jar文件上傳到此GoogleDrive公用文件夾。 ** ** https://drive.google.com/folderview?id=0BzPg_acW3VmsYTZWbGcxdjdSdmc&usp=sharing 如果我這個打破任何版權法,請讓我知道刪除它,所以我會被起訴的安全: P – Soley 2016-09-01 15:53:58