2012-05-17 50 views
0

我正在使用gstreamer库进行Java项目,需要能够从网络摄像头捕获图像。如何从网络摄像头捕获图像WHILST也已经使用Java Gstreamer从网络摄像头进行流式传输?

我已经有显示摄像头流的代码,我只是无法弄清楚如何在按下按钮旁边的按钮来捕捉图像。

我已经搜索了互联网,但只能找到显示流或捕获图像的代码片段,但都没有说明两个...我试图合并这些代码段,但没有'我也为我工作。

我需要做些什么才能使其发挥作用?

public class WebcamPanel extends JPanel { 

    private static Pipeline pipe; 

    public WebcamPanel(){ 

     String[] args = {}; 
     args = Gst.init("Webcam", args); 

     pipe = new Pipeline("pipeline"); 

     final Element videosrc = ElementFactory.make("dshowvideosrc", "source"); 
     final Element videofilter = ElementFactory.make("capsfilter", "flt"); 
     videofilter.setCaps(Caps.fromString("video/x-raw-yuv, width=320, height=240")); 

     setLayout(new GridBagLayout()); 
     final GridBagConstraints c = new GridBagConstraints(); 

     JButton takePic = new JButton(); 
     takePic.setPreferredSize(new Dimension(50,50)); 

     c.gridx = 0; 
     c.insets = new Insets(0,10,0,0); 
     add(takePic,c); 

     c.gridx = 2; 
     c.gridwidth = GridBagConstraints.REMAINDER; 
     c.insets = new Insets(0,40,0,0); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       VideoComponent videoComponent = new VideoComponent(); 
       Element videosink = videoComponent.getElement(); 
       // This gives 2nd window with stream from webcam 
       // Element videosink = ElementFactory.make("xvimagesink", "sink"); 
       pipe.addMany(videosrc, videofilter, videosink); 
       Element.linkMany(videosrc, videofilter, videosink); 

       videoComponent.setPreferredSize(new Dimension(320, 240)); 
       add(videoComponent,c); 
       videoComponent.setVisible(true); 
       // Start the pipeline processing 
       pipe.setState(State.PLAYING); 
      } 
     }); 

    } 
} 

回答

0

你看看camerabin2吗?这将为您实现整个相机工作流程(取景器,图像捕捉,视频捕捉,效果...)。 基本方法是开启第二流并从中捕获选定的图像(例如,使用valve!jpegenc!multifilesink并打开所选图像的阀门),或使用输出选择器至图像保存管道或使用缓冲探针(hacky)。