// rtmp_manager.hpp #pragma once #include #include #include #include #include #include #include #include "app_config.hpp" #include "logger.hpp" class RTMPManager { public: struct StreamStatus { bool running{false}; std::string last_error; }; // 初始化与控制接口 static void init(); static void start_all(); static void stop_all(); static bool is_streaming(const std::string &cam_name); static std::string get_stream_url(const std::string &cam_name); // 旧版接口(已保留) static std::vector> get_all_status(); // ✅ 新增:单通道状态结构体(用于心跳) struct ChannelInfo { int loc; // 摄像头位置索引(0~7) std::string url; // 正常时的推流地址 bool running; // 是否正常运行 std::string reason; // 错误原因(仅在异常时填) }; // ✅ 新增:获取所有通道详细状态 static std::vector get_all_channels_status(); private: struct StreamContext { std::atomic running{false}; std::thread thread; StreamStatus status; }; static void stream_loop(Camera cam, StreamContext *ctx); static GstElement *create_pipeline(const Camera &cam); static std::string make_key(const std::string &name); static std::unordered_map> streams; static std::mutex streams_mutex; static constexpr int RETRY_BASE_DELAY_MS = 3000; };