gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:19 26 4
gpt4 key购买 nike

我目前遇到 live555 问题。

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

公开的两个主要功能是:

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

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

但是,为了能够从外部线程(调用 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 及其子 session ?

如果 eventLoop 不再运行,我无法向服务器发送 TEARDOWN 命令。所以我现在对最好的方法有点迷茫。

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

提前致谢。

最佳答案

I cannot send the TEARDOWN command to the server if the eventLoop is not running anymore.

这是不准确的,需要主循环来接收消息而不是发送消息。

为了在主循环之后和释放环境之前正确关闭 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。

关于c++ - Live555 - 使用 watchVariable 正确关闭客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40061481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com