// rtsp_manager.hpp #pragma once #include #include "app_config.hpp" #include #include #include #include #include enum class StreamType { MAIN, SUB }; class RTMPManager { public: static void init(); static void start_camera(const Camera &cam, StreamType type); static void stop_camera(const std::string &cam_name, StreamType type); static void stop_all(); static bool is_streaming(const std::string &cam_name, StreamType type); static bool is_any_streaming(); static std::string get_stream_url(const std::string &cam_name, StreamType type); private: struct StreamContext { std::atomic running; std::thread thread; StreamContext() : running(false) {} StreamContext(StreamContext &&) = default; // 允许移动 StreamContext &operator=(StreamContext &&) = default; StreamContext(const StreamContext &) = delete; StreamContext &operator=(const StreamContext &) = delete; }; static std::unordered_map streams; static std::mutex streams_mutex; static void stream_loop(Camera cam, StreamType type); static GstElement *create_pipeline(const Camera &cam, StreamType type); static std::string make_stream_key(const std::string &cam_name, StreamType type); };