gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:34:47 25 4
gpt4 key购买 nike

我已经创建了 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]://[user:passwd@]host[:port]/abspath[?query]

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

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

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

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

如何接收客户端的 rtsp 查询,其中“query”填充为“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)
{
gulong describeConfigureId = g_signal_connect(arg1, "describe-request", (GCallback)DescribeRequest, user_data);

//Do not forget about g_signal_handler_disconnect
}

void DescribeRequest(GstRTSPClient *gstrtspclient, GstRTSPContext *arg1, gpointer user_data)
{
gchar *urlString = gst_rtsp_url_get_request_uri(arg1->uri);

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

g_free(urlString);
}

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

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);
...

关于c++ - 为每个新客户端提取 GStreamer 和 URI 查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com