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+C
在 gst-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));
. . .
}
}
我正在使用 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+C
在 gst-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));
. . .
}
}