Java 从gstreamer管道捕获图像
我有一个IP摄像头,它使用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
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元素()