繁体   English   中英

Live555-使用watchVariable正确关闭客户端

[英]Live555 - Proper client shutdown with watchVariable

我目前遇到live555问题。

我为项目编写了一个Windows DLL,该DLL公开了一个非常简单的API,可轻松启动RTSP客户端。 统一程序加载DLL,然后使用API​​接收帧。

公开的两个主要功能是:

bool startRTSP(bool isTCP);
bool stopRTSP();

由于Live555库的性质,我无法在统一线程中启动RTSP。 因此,当调用startRTSP时,我创建了一个新线程,并通过一些回调将帧发送到统一状态。

但是,为了能够从外部线程(调用stopRTSP的统一线程)停止RTSP,我正在使用eventLoopWatchVariable。 例如,这是RTSP事件循环的启动方式:

env->taskScheduler().doEventLoop(&eventLoopWatchVariable);

调用stop函数时,从统一线程将eventLoopWatchVariable设置为1。 关闭事件循环。

在此事件循环退出后,立即调用清理函数:

delete scheduler;
env->reclaim();

我期望thoose函数能够通过RTSP客户端并关闭它们。 (例如,将TEARDOWN命令发送到服务器)

但是他们显然没有,客户也永远不会被摧毁!

我怀疑它会在同一数据流中引起重新发送问题。 (发送SETUP,DESCRIBE和PLAY命令并接收到响应,但没有数据传入)使用VLC或mplayer,我可以看到服务器仍在流式传输,因此这不是服务器问题。

当eventLoopWatchVariable设置为1时,我如何要求live555关闭RTSPClient及其子会话?

如果eventLoop不再运行,则无法将TEARDOWN命令发送到服务器。 所以现在我对最佳方法的做法有些迷茫。

如果有人对此有想法,我很想听听!

提前致谢。

如果eventLoop不再运行,则无法将TEARDOWN命令发送到服务器。

这是不精确的,需要mainloop接收消息而不是发送消息。

为了在主循环之后和释放环境之前正确关闭RTSP客户端连接,您可以像这样进行操作:

// wait for stop event
env->taskScheduler().doEventLoop(&eventLoopWatchVariable);

// send tear TEARDOWN
client->sendTeardownCommand(session, NULL);

// close subsession & session
Medium::close(session);

// close RTSP client
Medium::close(client);

// free environment & scheduler
env->reclaim();
delete scheduler;

您还可以等待TEARDOWN答案,给sendTeardownCommand回调,然后再次运行doEventLoop。

这是完全关闭rtsp客户端的正确方法。 该答案假定您使用以下程序作为rtsp客户端的基础:testProgs / testRTSPClient.cpp(与live555捆绑在一起)。

首先,将openURL()修改为将“ RTSPClient * rtspClient”返回给调用方的方式。 然后使用以下示例(从testRTSPClient.cpp内部的main()继续):

RTSPClient* rtspClient = openURL(*env, argv[0], argv[1]);

// All subsequent activity takes place within the event loop:
env->taskScheduler().doEventLoop(&eventLoopWatchVariable);

//... do whatever stuff you want to do in the background...

//start this code when you want to stop the rtsp client
eventLoopWatchVariable = 1;

//run this code for each rtspClient that exists
StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs;

rtspClient->sendTeardownCommand(*scs.session, NULL);

Medium::close(client->rtspClient);
//end code segment

env->reclaim();
env = NULL;
delete scheduler;
scheduler = NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM