kunlang_video/include/rtmp_manager.hpp
2026-01-22 09:29:10 +08:00

76 lines
1.9 KiB
C++
Raw Permalink 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.

// rtmp_manager.hpp
#pragma once
#include <gst/gst.h>
#include <atomic>
#include <mutex>
#include <string>
#include <thread>
#include <unordered_map>
#include <vector>
#include "app_config.hpp"
#include "logger.hpp"
std::string get_ip_address(const std::string& ifname);
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);
// 新增:单通道状态结构体(用于心跳)
struct ChannelInfo
{
int loc; // 摄像头位置索引0~7
std::string url; // 正常时的推流地址
bool running; // 是否正常运行
std::string reason; // 错误原因(仅在异常时填)
};
// 新增:获取所有通道详细状态
static std::vector<ChannelInfo> get_all_channels_status();
// 控制 live 分支开关MQTT 用)
static void set_live_enabled_all(bool enable);
static void set_live_enabled(const std::string& cam_name, bool enable);
static bool g_record_enabled;
private:
struct StreamContext
{
std::atomic<bool> thread_running{false};
std::thread thread;
StreamStatus status;
std::mutex status_mutex;
GstElement* live_valve{nullptr};
GstElement* record_valve = nullptr;
};
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<std::string, std::unique_ptr<StreamContext>> streams;
static std::mutex streams_mutex;
static std::atomic<bool> g_live_enabled;
static constexpr int RETRY_BASE_DELAY_MS = 3000;
};