从 gstreamer 管道捕获图像
Capture images from a gstreamer Pipeline
我有一个使用RTSP
协议传输图像的网络摄像机,下面的代码使用gstreamer
连接,拾取这些图像并在Swing
中显示(工作只是对)。
我想做的是直接从gstreamer
的Pipeline
中提取帧(不使用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);
}
}
您可以使用 appsink 从管道获取缓冲区。
我建议使用焊盘探针 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-add-probe)。然后它将使用即将通过 pad 的缓冲区触发回调。所以你可以把它放在管道中你最感兴趣的地方(例如编码的 RTP 数据或未压缩的原始图像)。
如果您只对最终数据感兴趣,appsink 也是查看的好地方 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html)。
如果是 appsink,并且您想要显示图像并且还想要数据,您可以使用 tee 元素 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-tee.html)。
我有一个使用RTSP
协议传输图像的网络摄像机,下面的代码使用gstreamer
连接,拾取这些图像并在Swing
中显示(工作只是对)。
我想做的是直接从gstreamer
的Pipeline
中提取帧(不使用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);
}
}
您可以使用 appsink 从管道获取缓冲区。
我建议使用焊盘探针 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-add-probe)。然后它将使用即将通过 pad 的缓冲区触发回调。所以你可以把它放在管道中你最感兴趣的地方(例如编码的 RTP 数据或未压缩的原始图像)。
如果您只对最终数据感兴趣,appsink 也是查看的好地方 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html)。
如果是 appsink,并且您想要显示图像并且还想要数据,您可以使用 tee 元素 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-tee.html)。