基于GStreamer的UDP传输RTSP服务器端口获取问题
解决GStreamer RTSP服务器UDP端口获取问题
要获取RTSP服务器UDP传输的RTP/RTCP端口,不要依赖你测试过的那些RTSP会话信号,正确的方式是监听GstRTSPMedia的pad-added信号,当媒体流的RTP/RTCP源Pad被创建时,从对应的udpsrc元素中读取已绑定的本地端口。
核心原因
你测试的多数信号要么不涉及传输层资源(如play-request、new-session),要么时机过早(如setup-request)——在setup-request触发时,UDP传输的端口还未完成系统绑定,因此返回-1。只有当媒体流准备好发送数据,udpsrc完成端口绑定并添加源Pad时,才能拿到有效端口值。
具体实现步骤
- 在
new-session或setup-request信号回调中,获取当前会话对应的GstRTSPMedia对象。 - 给该
GstRTSPMedia绑定pad-added信号回调,监听源Pad的创建事件。 - 在
pad-added回调中,判断Pad是否为源方向(GST_PAD_SRC),且名称包含rtp或rtcp(对应RTP/RTCP传输流)。 - 获取该Pad所属的
udpsrc元素,通过g_object_get读取其port属性,即为服务器的UDP端口。
代码示例(C语言)
static void media_pad_added_handler(GstElement *media_element, GstPad *pad, gpointer user_data) { // 仅处理源方向的Pad if (gst_pad_get_direction(pad) != GST_PAD_SRC) { return; } const gchar *pad_name = gst_pad_get_name(pad); // 判断是否为RTP或RTCP流的Pad if (g_strstr_len(pad_name, -1, "rtp") || g_strstr_len(pad_name, -1, "rtcp")) { GstElement *udpsrc = gst_pad_get_parent_element(pad); if (udpsrc != NULL) { guint port; g_object_get(udpsrc, "port", &port, NULL); g_print("服务器%s端口:%u\n", g_strstr_len(pad_name, -1, "rtp") ? "RTP" : "RTCP", port); g_object_unref(udpsrc); } } g_free((gchar *)pad_name); } // 在setup-request信号中绑定媒体的pad-added监听 static gboolean setup_request_handler(GstRTSPServer *server, GstRTSPMedia *media, GstRTSPMessage *request, GstRTSPMessage *response, gpointer user_data) { g_signal_connect(media, "pad-added", G_CALLBACK(media_pad_added_handler), NULL); return FALSE; // 允许服务器执行默认的Setup处理逻辑 }
验证说明
你的客户端管道无需修改,当客户端完成Setup并触发媒体流启动后,pad-added信号会被触发,此时就能获取到服务器实际绑定的UDP端口。
内容的提问来源于stack exchange,提问作者mahmud fatehi
相关产品推荐
相关产品推荐

