为每个新客户端提取GStreamer和URI查询参数

时间:2017-01-20 20:11:21

标签: c++ streaming video-streaming gstreamer rtsp

我创建了rtsp / h264 / mjpeg服务器。它运作良好。但现在我必须查询每个新连接的客户端。例如,我必须从客户端查询获得请求的解决方案:rtsp://192.116.10.20:8554 / stream?width = 1920& height = 1280

我尝试使用以下代码执行此操作:

 ....
gulong clientConnectedConfigureId = g_signal_connect(m_server, "client-connected", (GCallback)ClientConnected, this);
 ....

static void ClientConnected(GstRTSPServer *gstrtspserver, GstRTSPClient *arg1, gpointer user_data)
    {
        GstRTSPConnection *connection = gst_rtsp_client_get_connection(arg1);

        if(!connection)
        {
            return;
        }

        GstRTSPUrl *uri = gst_rtsp_connection_get_url(connection);

        if(!uri)
        {
            return;
        }

        gchar *urlString = gst_rtsp_url_get_request_uri (uri);

        std::stringstream ssTemp;
        ssTemp << "ClientConnected - urlString = " << urlString;
        InternalLog::Debug(ssTemp.str());

        g_free(urlString); 
    }

GstRTSPUrl包含以下成员: // RTSP [U]:// [用户命令:passwd @]主机[?查询] [口] / ABSPATH

从VLC连接查询rtsp://192.116.10.20:8554 / stream?width = 1920&amp; height = 1280后,结果如下:

ClientConnected - urlString = rtsp://192.116.10.20:61099(null)

GstRTSPUrl仅包含host = 192.116.10.20和port = 61099。 “abspath”或“query”等其他字段等于NULL。

在netstat实用程序中,我看到端口61099是VLC应用程序的客户端端口。它连接到端口8554。

如何通过填写“width = 1920&amp; height = 1280”的“查询”来接收客户的rtsp查询?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案

static gchar *
default_gen_key (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
{
  gchar *result =
      g_strdup_printf ("%u%s", url->port, url->abspath);

  return result;
}

...
m_factory = gst_rtsp_media_factory_new();
GstRTSPMediaFactoryClass *klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (m_factory);
klass->gen_key = default_gen_key;
gst_rtsp_media_factory_set_shared(m_factory, TRUE);
...

如果您使用gst_rtsp_media_factory_set_shared(m_factory,TRUE); 那么你必须重新定义方法default_gen_key。因为URL用作确定是否需要创建新媒体的密钥。您可以使用以下代码执行此操作:

import android.R;