You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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时,才能拿到有效端口值。

具体实现步骤

  1. 在new-session或setup-request信号回调中,获取当前会话对应的GstRTSPMedia对象。
  2. 给该GstRTSPMedia绑定pad-added信号回调,监听源Pad的创建事件。
  3. 在pad-added回调中,判断Pad是否为源方向(GST_PAD_SRC),且名称包含rtp或rtcp(对应RTP/RTCP传输流)。
  4. 获取该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:12:42