89 lines
2.4 KiB
C++
89 lines
2.4 KiB
C++
// 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();
|
||
|
||
// 启动 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;
|
||
}
|