first commit

This commit is contained in:
cxh 2025-09-10 13:12:27 +08:00
parent b0ef86224a
commit 3cc7fe8304
3 changed files with 40 additions and 14 deletions

View File

@ -19,6 +19,7 @@ public:
static void mount_camera(const Camera &cam); static void mount_camera(const Camera &cam);
static void unmount_camera(const Camera &cam); static void unmount_camera(const Camera &cam);
static bool is_streaming(const std::string &cam_name); static bool is_streaming(const std::string &cam_name);
static bool is_any_streaming();
private: private:
static GMainLoop *loop; static GMainLoop *loop;

View File

@ -100,24 +100,16 @@ int main()
if (ENABLE_RTSP_THREAD) if (ENABLE_RTSP_THREAD)
{ {
while (!rtsp_thread_exited.load(std::memory_order_relaxed) && RTSPManager::stop();
std::chrono::steady_clock::now() < deadline)
auto stop_deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10);
while (RTSPManager::is_any_streaming() && std::chrono::steady_clock::now() < stop_deadline)
{ {
std::this_thread::sleep_for(poll_interval); std::this_thread::sleep_for(std::chrono::milliseconds(50));
} }
if (rtsp_thread.joinable()) if (rtsp_thread.joinable())
{
if (rtsp_thread_exited.load(std::memory_order_relaxed))
{
rtsp_thread.join(); rtsp_thread.join();
LOG_INFO("[MAIN] RTSP thread finished and joined.");
}
else
{
LOG_WARN("[MAIN] RTSP thread did not exit within timeout.");
}
}
} }
// 重置 MQTT 线程等待的截止时间 // 重置 MQTT 线程等待的截止时间

View File

@ -224,6 +224,29 @@ bool RTSPManager::is_streaming(const std::string &cam_name)
// 停止 server // 停止 server
void RTSPManager::stop() void RTSPManager::stop()
{ {
// 先卸载所有挂载摄像头
std::vector<std::string> cams_to_unmount;
{
std::lock_guard<std::mutex> lock(mounted_factories_mutex);
for (const auto &kv : mounted_factories)
cams_to_unmount.push_back(kv.first);
}
for (const auto &cam_name : cams_to_unmount)
{
Camera cam;
cam.name = cam_name;
unmount_camera(cam);
}
// 等待所有流停止(最多 5 秒)
auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(5);
while (is_any_streaming() && std::chrono::steady_clock::now() < deadline)
{
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
// 退出 main loop
if (loop) if (loop)
{ {
g_main_context_invoke(main_context, [](gpointer data) -> gboolean g_main_context_invoke(main_context, [](gpointer data) -> gboolean
@ -232,3 +255,13 @@ void RTSPManager::stop()
return G_SOURCE_REMOVE; }, loop); return G_SOURCE_REMOVE; }, loop);
} }
} }
// 新增接口:检查是否还有摄像头在流
bool RTSPManager::is_any_streaming()
{
std::lock_guard<std::mutex> lock(mounted_factories_mutex);
for (const auto &kv : streaming_status)
if (kv.second)
return true;
return false;
}