gst-rtsp-server:检测客户端断开连接

gst-rtsp-server: detect client disconnect

我正在使用 gst-rtsp-server 实现视频流管道。我需要知道 RTSP 客户端何时连接和断开连接。

从 gst-rtsp-server 提供的示例中,我可以检测到客户端使用 GstRTSPServer"client-connected" 信号进行连接。当客户端断开连接时,我正在寻找类似的东西。

我已经尝试了 GstRTSPClient"closed""teardown-request" 信号,但是当我断开客户端连接时,它们没有任何作用。

我也试过在计时器上调用以下函数,就像在几个示例中所做的那样。我希望在我终止客户端后的某个时候打印“Removed 1 sessions”,但它从来没有。

static gboolean
remove_sessions (GstRTSPServer * server)
{
  GstRTSPSessionPool *pool;

  pool = gst_rtsp_server_get_session_pool (server);
  guint removed = gst_rtsp_session_pool_cleanup (pool);
  g_object_unref (pool);
  g_print("Removed %d sessions\n", removed);

  return TRUE;
}

我的客户端是以下 gstreamer 管道:

gst-launch-1.0 -v rtspsrc location=rtsp://$STREAM_IP:8554/test latency=50 ! queue ! rtph264depay ! queue ! avdec_h264 ! autovideosink sync=false

如何检测客户端断开连接?

不确定我之前遇到了什么问题,但这确实有效:

当客户端关闭时(Ctrl+Cgst-launch-1.0 管道上),发出 GstRTSPClient 的“teardown-request”信号。

如果客户端失去与服务器的连接,我发布的 remove_sessions (GstRTSPServer * server) 函数将报告它在一段时间后删除了一个会话。

需要关闭 RTSP 服务器时调用 gst_rtsp_server_client_filter()(删除服务器前):

    GstRTSPFilterResult clientFilterFunc(GstRTSPServer* server, GstRTSPClient* client, gpointer user)
{
    return GST_RTSP_FILTER_REMOVE;
}
. . . 
{
. . . 
    if( clientCount )
        gst_rtsp_server_client_filter(server, clientFilterFunc, nullptr);

    if (G_IS_OBJECT(server))
    {
        g_object_unref(server);
        server = nullptr;
    }
. . .
}

为客户端连接和关闭截取的代码: {

void clientClosed(GstRTSPClient* client, gpointer user)
{
    --clientCount ;
    std::stringstream strm;
    strm << "Client closed ... count: " << ptrTestData->m_clientCount << std::endl;
    g_print("%s", strm.str().c_str());
}

void clientConnected(GstRTSPServer* server, GstRTSPClient* client, gpointer user)
{
    ++clientCount ;
    // hook the client close callback
    g_signal_connect(client, "closed", reinterpret_cast<GCallback>(clientClosed), user);
    std::stringstream strm;
    strm << "Client connected ... count: " << ptrTestData->m_clientCount << std::endl;
    g_print("%s", strm.str().c_str());
}

{ 
 . . . 
     g_signal_connect(server, "client-connected", reinterpret_cast<GCallback>(clientConnected), &(testData));
. . . 
}

}