128 lines
2.8 KiB
C++
128 lines
2.8 KiB
C++
#pragma once
|
||
|
||
#include <cstdint>
|
||
#include <cstddef>
|
||
#include <string>
|
||
#include <memory>
|
||
|
||
// FFMediaStream 现为静态库(CONFIG += staticlib),不使用 DLL 导入/导出修饰,
|
||
// 否则 MSVC 会以 __imp_ 方式查找符号导致 LNK2019。
|
||
#define VR_FFMEDIA_API
|
||
|
||
/**
|
||
* @brief 推流帧像素格式
|
||
*/
|
||
enum class EFFPushPixelFormat
|
||
{
|
||
NV12 = 0, // 4:2:0 半平面 (Y + UV)
|
||
YUV420P, // 4:2:0 平面
|
||
BGR24, // OpenCV 默认
|
||
RGB24,
|
||
BGRA32,
|
||
RGBA32,
|
||
};
|
||
|
||
/**
|
||
* @brief 编码类型
|
||
*/
|
||
enum class EFFEncodeType
|
||
{
|
||
H264 = 0,
|
||
H265,
|
||
MJPEG,
|
||
};
|
||
|
||
/**
|
||
* @brief 码率控制模式
|
||
*/
|
||
enum class EFFRcMode
|
||
{
|
||
CBR = 0,
|
||
VBR,
|
||
};
|
||
|
||
/**
|
||
* @brief 推流参数
|
||
*/
|
||
struct VrFFPushConfig
|
||
{
|
||
// 帧参数
|
||
unsigned int width{1920};
|
||
unsigned int height{1080};
|
||
EFFPushPixelFormat pixelFormat{EFFPushPixelFormat::NV12};
|
||
|
||
// 编码参数
|
||
EFFEncodeType encodeType{EFFEncodeType::H264};
|
||
unsigned int fps{30};
|
||
unsigned int gop{60};
|
||
unsigned int bitrateKbps{4096}; // 码率 (kbps)
|
||
EFFRcMode rcMode{EFFRcMode::CBR};
|
||
|
||
// RTSP 服务参数
|
||
std::string rtspHost{"127.0.0.1"}; // mediamtx 服务端 IP(主动推流目标)
|
||
std::string rtspPath{"/live/stream"}; // URL 路径
|
||
unsigned short rtspPort{8554};
|
||
std::string authRealm;
|
||
std::string authUser;
|
||
std::string authPass;
|
||
};
|
||
|
||
/**
|
||
* @brief IVrFFMediaPusher
|
||
*
|
||
* 基于 MPP 硬件编码 + FFmpeg libavformat 的 RTSP 推流(内存输入 -> swscale 格式转换 -> MPP 编码 -> RTSP)。
|
||
*
|
||
* 典型用法:
|
||
* IVrFFMediaPusher* pusher = nullptr;
|
||
* IVrFFMediaPusher::CreateObject(&pusher);
|
||
* pusher->Init(cfg);
|
||
* pusher->Start();
|
||
* pusher->PushFrame(data, size);
|
||
* ...
|
||
* pusher->Stop();
|
||
* delete pusher;
|
||
*/
|
||
class VR_FFMEDIA_API IVrFFMediaPusher
|
||
{
|
||
public:
|
||
virtual ~IVrFFMediaPusher() = default;
|
||
|
||
// 工厂
|
||
static bool CreateObject(IVrFFMediaPusher** ppPusher);
|
||
|
||
/**
|
||
* @brief 初始化推流链路
|
||
* @return 0 成功
|
||
*/
|
||
virtual int Init(const VrFFPushConfig& config) = 0;
|
||
|
||
/**
|
||
* @brief 启动推流(建立 RTSP 服务,等待客户端拉流)
|
||
*/
|
||
virtual int Start() = 0;
|
||
|
||
/**
|
||
* @brief 喂入一帧待编码的图像
|
||
* @param data 帧数据指针
|
||
* @param size 帧数据大小(字节)
|
||
* @param ptsUs PTS,单位微秒;传 0 由内部生成
|
||
* @return 0 成功
|
||
*/
|
||
virtual int PushFrame(const void* data, size_t size, int64_t ptsUs = 0) = 0;
|
||
|
||
/**
|
||
* @brief 停止推流
|
||
*/
|
||
virtual int Stop() = 0;
|
||
|
||
/**
|
||
* @brief 反初始化
|
||
*/
|
||
virtual int UnInit() = 0;
|
||
|
||
/**
|
||
* @brief 获取当前推流 URL(含 IP/端口/路径)
|
||
*/
|
||
virtual std::string GetRtspUrl(const std::string& localIp) const = 0;
|
||
};
|