【发布时间】:2016-10-15 16:25:37
【问题描述】:
我目前面临 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);
当调用停止函数时,eventLoopWatchVariable 从统一线程设置为 1。 关闭事件循环。
在此事件循环退出后立即调用清理函数:
delete scheduler;
env->reclaim();
我期待这些功能通过 RTSP 客户端并关闭它们。 (例如向服务器发送 TEARDOWN 命令)
但他们显然没有,而且客户端永远不会被破坏!
我怀疑它会导致同一流出现重新连接问题。 (发送 SETUP 、 DESCRIBE 和 PLAY 命令并收到响应,但没有数据到来)使用 VLC 或 mplayer 我可以看到服务器仍在流式传输,所以这不是服务器问题。
当 eventLoopWatchVariable 设置为 1 时,我如何要求 live555 关闭 RTSPClient 及其子会话?
如果 eventLoop 不再运行,我无法将 TEARDOWN 命令发送到服务器。所以我现在对最好的方法有点迷茫。
如果有人对此有任何想法,我很想听听!
提前致谢。
【问题讨论】:
标签: c++ multithreading rtsp live555