Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从gstreamer管道捕获图像_Java_Gstreamer_Rtsp - Fatal编程技术网

Java 从gstreamer管道捕获图像

Java 从gstreamer管道捕获图像,java,gstreamer,rtsp,Java,Gstreamer,Rtsp,我有一个IP摄像头,它使用RTSP协议传输图像,下面的代码使用gstreamer连接、拾取这些图像并在Swing中显示(工作正常) 我想做的是直接从gstreamer的管道中拾取帧(不要使用Swing),这样我可以逐帧分析图像。 导入java.awt.BorderLayout; 导入java.awt.Dimension; 导入javax.swing.JFrame; 导入javax.swing.SwingUtilities; 导入org.gstreamer.Element; 导入org.gstre

我有一个IP摄像头,它使用
RTSP
协议传输图像,下面的代码使用
gstreamer
连接、拾取这些图像并在
Swing
中显示(工作正常)

我想做的是直接从
gstreamer
管道中拾取帧(不要使用
Swing
),这样我可以逐帧分析图像。

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入org.gstreamer.Element;
导入org.gstreamer.Gst;
导入org.gstreamer.Pipeline;
导入org.gstreamer.State;
导入org.gstreamer.swing.VideoComponent;
公共班机{
公共静态void main(字符串[]args)引发InterruptedException{
args=Gst.init(“PipelineLauncher”,args);
最终字符串def=“rtspsrc位置=rtsp://192.168.25.160/av0_0 延迟=0!decodebin!ffmpegcolorspace name=testp”;
最终管道=管道启动(def);
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
//创建视频组件并将其链接到
VideoComponent VideoComponent=新的VideoComponent();
Element videosink=videoComponent.getElement();
添加(视频接收器);
pipe.getElementByName(“testp”).link(videosink);
管道设置状态(状态为暂停);
if(管道敷设()){
System.out.println(“管道播放”);
}否则{
System.out.println(“管道未播放”);
}
//启动管道处理
吹奏;
pipe.setState(State.PLAYING);
if(管道敷设()){
System.out.println(“管道播放”);
}否则{
System.out.println(“管道未播放”);
}
//现在创建一个JFrame来显示视频输出
JFrame=新JFrame(“Swing视频测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(videoComponent,BorderLayout.CENTER);
videoComponent.setPreferredSize(新尺寸(800600));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
Gst.main();
pipe.setState(State.NULL);
}
}

您可以使用appsink从管道获取缓冲区


我建议使用pad探头()。然后,它将触发一个回调,其中缓冲区将要通过pad。因此,您可以将其放在管道中最感兴趣的焊盘上(例如,编码的RTP数据或未压缩的原始图像)

如果您只是对最终数据感兴趣,appsink也是一个查看()的好地方

对于appsink,如果您希望显示图像并同时需要数据,则可以使用tee元素()