我有一个 Imperx GigE Vision 相机,我正在尝试创建一个简单的管道来侦听其 UDP 端口并显示视频流,但图像无法正确显示。我验证了图像在 Imperx 实用程序、Imperx 示例 python 脚本中以及使用 Aravis Viewer 中正确传输。
我尝试了无数种不同的上限和元素、像素格式、缓冲区大小等组合,但最简单的我的管道如下所示:
gst-launch-1.0 -e -v udpsrc port=62000 ! "video/x-raw,format=BGR,width=2064,height=1544,framerate=10/1" ! queue ! rawvideoparse ! videoconvert ! ximagesink
结果是这种变化的一些变化——倾斜和重复。似乎 hsync 或 vsync 可能存在一些问题,但在 gstreamer 文档中没有找到太多相关信息。
注意:我真的不认为该相机正在使用 RTP - 手册中没有提到它,并且我尝试使用 rtp 相关元素运行管道都失败了,并出现“不是有效的 RTP 有效负载”或其他错误.
我还下载了 Aravis 插件并使用了它 - 这实际上似乎有效(!)...但只有灰色。该管道看起来像这样。
gst-launch-1.0 -e -v aravissrc ! videoconvert ! queue ! xvimagesink
(如果可能的话,我宁愿不必使用这个插件)
我真的很感激任何建议或调试技巧!
更新
aravis 管道的详细输出:
/GstPipeline:pipeline0/GstAravis:aravis0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps = video/x-raw, width=(int)2064, height=(int)1544, framerate=(fraction)10/1, format=(string)YV12
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-raw, width=(int)2064, height=(int)1544, framerate=(fraction)10/1, format=(string)YV12
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:src: caps = video/x-raw, width=(int)2064, height=(int)1544, framerate=(fraction)10/1, format=(string)YV12
/GstPipeline:pipeline0/GstXvImageSink:xvimagesink0.GstPad:sink: caps = video/x-raw, width=(int)2064, height=(int)1544, framerate=(fraction)10/1, format=(string)YV12
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, framerate=(fraction)10/1
这是我在没有 aravis 插件的情况下的尝试
gst-launch-1.0 -e -v udpsrc port=62000 ! rawvideoparse width=2064 height=1544 framerate=10/1 format=25 ! queue ! "video/x-raw, format=(string)GRAY8" ! videoconvert ! ximagesink
该命令的详细输出似乎表明它转换为 BGRx (这可能是一个问题?),我不知道如何让它停止(注意
videoconvert
src 和 ximagesink
的行)
/GstPipeline:pipeline0/GstRawVideoParse:rawvideoparse0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps = video/x-raw, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1, format=(string)BGRx
/GstPipeline:pipeline0/GstXImageSink:ximagesink0.GstPad:sink: caps = video/x-raw, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1, format=(string)BGRx
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)2064, height=(int)1544, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1
您对所设置的上限有 100% 的把握吗?从你的图片来看,相机确实正在发送灰度,而你试图将其解释为 BGR,因此每行重复 3 次。
最后,如果您使用 Basler 相机,您可能会对这些插件感兴趣: