为每个新客户端提取GStreamer和URI查询参数
问题描述:
我创建了rtsp/h264/mjpeg服务器。它运作良好。但现在我必须为每个新连接的客户端查询。例如,我有从客户端获得的查询请求解析:RTSP://192.116.10.20:8554 /流宽度= 1920 &高度= 1280为每个新客户端提取GStreamer和URI查询参数
我已经tryed使用下面的代码来做到这一点:
....
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
与查询RTSP从VLC连接之后[查询?]:// 192.116.10.20:8554/stream?width=1920 & height = 1280结果如下:
ClientConnected - urlString = RTSP://192.116.10.20:61099(空)
GstRTSPUrl仅包含主机= 192.116.10.20和端口= 61099。其他字段如“abspath”或“query”等于NULL。
在netstat实用程序中,我看到端口61099是VLC应用程序的客户端端口。它连接到端口8554.
如何才能接收rtsp查询客户端与“查询”填充到“宽度= 1920 &高度= 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);
...