2015-12-04 2 views
2

У меня есть IP-камера, которая использует протокол RTSP для передачи изображений, следующий код использует gstreamer для подключения, получения этих изображений и отображения в Swing (работает в самый раз).Захват изображений из gstreamer Pipeline

То, что я хочу сделать, это подобрать кадры непосредственно от Pipeline из gstreamer (не использовать Swing), так что я могу анализировать кадр за кадром изображения.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import org.gstreamer.Element; 
import org.gstreamer.Gst; 
import org.gstreamer.Pipeline; 
import org.gstreamer.State; 
import org.gstreamer.swing.VideoComponent; 

public class Main { 

    public static void main(String[] args) throws InterruptedException { 
     args = Gst.init("PipelineLauncher", args); 
     final String def = "rtspsrc location=rtsp://192.168.25.160/av0_0 latency=0 ! decodebin ! ffmpegcolorspace name=testp"; 
     final Pipeline pipe = Pipeline.launch(def); 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       // Create the video component and link it in     
       VideoComponent videoComponent = new VideoComponent(); 
       Element videosink = videoComponent.getElement(); 
       pipe.add(videosink); 
       pipe.getElementByName("testp").link(videosink); 
       pipe.setState(State.PAUSED); 

       if (pipe.isPlaying()) { 
        System.out.println("Pipeline playing"); 
       } else { 
        System.out.println("Pipeline not playing"); 
       } 

       // Start the pipeline processing 
       pipe.play(); 
       pipe.setState(State.PLAYING); 

       if (pipe.isPlaying()) { 
        System.out.println("Pipeline playing"); 
       } else { 
        System.out.println("Pipeline not playing"); 
       } 

       // Now create a JFrame to display the video output 
       JFrame frame = new JFrame("Swing Video Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(videoComponent, BorderLayout.CENTER); 
       videoComponent.setPreferredSize(new Dimension(800, 600)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 

     Gst.main(); 
     pipe.setState(State.NULL); 
    } 

} 

ответ

2

Я предлагаю использовать площадку зонда (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-add-probe). Затем он вызовет обратный вызов с буфером, который вот-вот пройдет через пэд. Таким образом, вы можете поместить это на площадку, которую вас больше всего интересует в конвейере (например, закодированные данные RTP или несжатое исходное изображение).

Если вас интересуют только конечные данные, приложение apps также является хорошим местом для просмотра (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html).

В случае использования приложений и если вы хотите отобразить изображение, а также хотите получить данные, вы можете использовать элемент тройника (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-tee.html).

Смежные вопросы