Gstreamer:为啥我不能在 localhost 上通过 UDP 发送数据?

Posted

技术标签:

【中文标题】Gstreamer:为啥我不能在 localhost 上通过 UDP 发送数据?【英文标题】:Gstreamer: why can't I send data over UDP on localhost?Gstreamer:为什么我不能在 localhost 上通过 UDP 发送数据? 【发布时间】:2016-08-08 15:56:06 【问题描述】:

我正在尝试在 localhost 上测试 udp 流,但它没有显示任何内容:

videotestsrc(或audiotestsrc)-> udpsink(端口:5078,主机:127.0.0.1)

代码如下:

console_out_inf("TESTING", "Starting work with test elements");
gint port = 5078;
// TEST PIPELINE OUT
gst_bin_add_many(GST_BIN(GSD->pipetest_out), GSD->testsrc, GSD->udpsink, NULL);
gchar* host = "127.0.0.1";
g_object_set(GSD->udpsink, "port", port, NULL);
g_object_set(GSD->udpsink, "host", host, NULL);
if (!gst_element_link(GSD->testsrc, GSD->udpsink))
    console_out_bad("STREAMING", "Error linking test udp elements -- SEND");
else
    console_out_yes("STREAMING", "Correctly linked test udp elements -- SEND");

// TEST PIPELINE IN
gst_bin_add_many(GST_BIN(GSD->pipetest_in), GSD->udpsrc, GSD->autovideosink, NULL);

gst_element_set_state(GSD->udpsrc, GST_STATE_NULL);
g_object_set(GSD->udpsrc, "port", port, NULL);

if (!gst_element_link(GSD->udpsrc, GSD->autovideosink))
    console_out_bad("STREAMING", "Error linking test udp elements -- RECEIVE");
else
    console_out_yes("STREAMING", "Correctly linked test udp elements -- RECEIVE");
// PLAY TEST PIPELINE OUT
GstStateChangeReturn ret1;
ret1 = gst_element_set_state(GSD->pipetest_out, GST_STATE_PLAYING);
if (ret1 == GST_STATE_CHANGE_FAILURE)
    console_out_bad("TESTING", "Failed playing pipetest out");
else
    console_out_yes("TESTING", "Correctly played pipetest out");

// PLAY TEST PIPELINE IN
GstStateChangeReturn ret2;
ret2 = gst_element_set_state(GSD->pipetest_in, GST_STATE_PLAYING);
if (ret2 == GST_STATE_CHANGE_FAILURE)
    console_out_bad("TESTING", "Failed playing pipetest in");
else
    console_out_yes("TESTING", "Correctly played pipetest in");

// PRINT PIPELINES
GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(GSD->pipetest_out), GST_DEBUG_GRAPH_SHOW_ALL, "pipetest_out");
GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(GSD->pipetest_in), GST_DEBUG_GRAPH_SHOW_ALL, "pipetest_in");

这是“我自己的控制台输出”:

编辑:不再相关!一切都很好,管道是正确构建的,但是

管道输出:videotestsrc --> udpsink(主机:127.0.0.1,端口:5078)

管道输入:udpsrc(端口:5078)--> autovideosink

自动视频接收器不显示任何内容! 通过检查 netstat -a,该端口上没有显示连接。

附加信息:

    使用“gstreamer 调试”生成的图表当然只包含连接到 udpsink 的视频/音频 testsrc 元素。 我第一次运行该代码时,出现了“Windows 防火墙窗口”,所以我猜想正在发送/接收一些东西。 这是在 Visual Studio 2013/Qt5 插件项目中,但这应该不是问题

有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

这段代码看起来不错,但它与您发布的控制台输出无关。

尝试使用命令行 gst-launch 逐个测试您的管道:

gst-launch-1.0 -e -v videotestsrc ! udpsink host="127.0.01"

首先连接到 fakesink,然后在 udp 接收器中交换,一旦你在命令行中工作,就可以在代码中镜像命令。

尝试使用 host="localhost" 或 host="192.168.0.1" 我不记得了,但我认为 udpsink 可能无法发送到环回

【讨论】:

你是什么意思它与我发布的输出无关?第一行只是为了表明元素已正确初始化(通过 gst_element_factory_make(...) 我的意思是,如果没有看到所有相关代码,很难确定它的正确性。例如,您可能在创建后无意中破坏了元素。 你是对的!我在另一个管道中使用 udpsink。这就是为什么我无法在其中构建包含该元素的 pipetest_out 的原因。然而,现在我的问题的后半部分仍然存在:我在 localhost 上发送 udp 数据包,它应该显示从 pipetest_out 传入的视频,但它没有这样做。请注意,我编辑了问题和描述。谢谢@thesombrerokid 我从来没有尝试过这个,但我猜它不会工作有几个原因:1.) 不保证 udp 数据包被传送,2.) 不保证按顺序传送。 3.)您需要安排管道同时运行以避免丢失数据包。如果您在发送视频之前将视频解码为原始帧,它可能会起作用,这意味着数据不需要按顺序到达等。如果您这样做,将会有更多数据编辑:实际上,最后一部分不是是的,testsrc 已经在原始帧中了。

以上是关于Gstreamer:为啥我不能在 localhost 上通过 UDP 发送数据?的主要内容,如果未能解决你的问题,请参考以下文章

官方教程中的GStreamer示例不能使用GStreamer 1.14.1在Ubuntu 18.04上运行

我没用过Linux,现在用的是getoo系统, 如何安装gstreamer?各位强人能不能给点详细的答案

gstreamer让playbin能够播放rtp over udp流数据

如何使用 GStreamer 以编程方式创建视频(来自 RGB 和 PCM)?

使用 gstreamer 播放传入的 RTP 视频流

我是不是需要使用 Gstreamer 构建 OpenCV 才能在 OpenCV 中使用 Gstreamer