sweeper_video/src/main.cpp
2025-10-17 15:29:38 +08:00

89 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// main.cpp
#include <unistd.h>
#include <atomic>
#include <chrono>
#include <csignal>
#include <thread>
#include "app_config.hpp"
#include "logger.hpp"
#include "mqtt_client_wrapper.hpp"
#include "rtmp_manager.hpp"
std::atomic<bool> g_running(true);
static void signal_handler(int signum)
{
g_running.store(false, std::memory_order_relaxed);
const char msg[] = "[MAIN] Signal received, shutting down...\n";
write(STDERR_FILENO, msg, sizeof(msg) - 1);
}
int main()
{
// ---------- 信号处理 ----------
struct sigaction sa{};
sa.sa_handler = signal_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, nullptr);
sigaction(SIGTERM, &sa, nullptr);
signal(SIGPIPE, SIG_IGN);
// ---------- 初始化日志 ----------
Logger::set_log_to_file(get_executable_dir_file_path("app.log"));
LOG_INFO("[MAIN] ===== Vehicle Video Service Starting =====");
try
{
// 加载配置
g_app_config = AppConfig::load_from_file(get_executable_dir_file_path("config.json"));
LOG_INFO("[MAIN] Loaded config from config.json");
}
catch (const std::exception &e)
{
LOG_ERROR(std::string("[MAIN] Failed to load config: ") + e.what());
return -1;
}
// ---------- 初始化 GStreamer ----------
RTMPManager::init();
// ---------- 自动推流8 路录像守护) ----------
LOG_INFO("[MAIN] Starting all record streams...");
RTMPManager::start_all_record_streams();
// 启动 MQTT 线程
std::thread mqtt_thread(
[]
{
try
{
LOG_INFO("[MAIN] MQTT thread started.");
mqtt_client_thread_func(); // 在回调里执行推流控制
}
catch (const std::exception &e)
{
LOG_ERROR(std::string("[MAIN] MQTT thread crashed: ") + e.what());
}
LOG_INFO("[MAIN] MQTT thread exiting...");
});
// 主循环,仅等待退出信号
while (g_running.load(std::memory_order_relaxed)) std::this_thread::sleep_for(std::chrono::milliseconds(200));
// ---------- 退出清理 ----------
LOG_INFO("[MAIN] Shutdown requested. Stopping RTMP streams...");
RTMPManager::stop_all();
if (mqtt_thread.joinable())
{
mqtt_thread.join();
LOG_INFO("[MAIN] MQTT thread joined.");
}
LOG_INFO("[MAIN] ===== Vehicle Video Service Exited Cleanly =====");
return 0;
}