2017-01-20 20 views
1

Я создал сервер rtsp/h264/mjpeg. Это работает хорошо. Но теперь я должен получить запрос для каждого нового подключенного клиента. Например, я должен получить запрашиваемое разрешение от запроса клиента: RTSP: //192.116.10.20: 8554/поток ширины = 1920 & высоты = 1280Вывод параметров запроса GStreamer и URI для каждого нового клиента

Я судимый сделать это, используя следующий код:

.... 
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 [и]: // [пользователь: ПАРОЛЬ @] хост [: порт]/abspath

После соединения с VLC с RTSP запроса [запроса?]: // 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 для клиента с «запросом», заполненным до «width = 1920 & height = 1280»?

ответ

1

Я нашел решение

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