96 lines
2.5 KiB
C
96 lines
2.5 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <cstdint>
|
|||
|
|
#include <cstddef>
|
|||
|
|
#include <string>
|
|||
|
|
#include <functional>
|
|||
|
|
|
|||
|
|
// DLL 导出宏(FFMEDIASTREAM_LIBRARY 在 .pro 中已定义)
|
|||
|
|
#ifdef _WIN32
|
|||
|
|
# ifdef FFMEDIASTREAM_LIBRARY
|
|||
|
|
# define VR_FFMEDIA_API __declspec(dllexport)
|
|||
|
|
# else
|
|||
|
|
# define VR_FFMEDIA_API __declspec(dllimport)
|
|||
|
|
# endif
|
|||
|
|
#else
|
|||
|
|
# define VR_FFMEDIA_API
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 拉流帧输出格式
|
|||
|
|
*/
|
|||
|
|
enum class EFFPullPixelFormat
|
|||
|
|
{
|
|||
|
|
NV12 = 0, // 原生硬解输出,零拷贝最快
|
|||
|
|
RGBA32, // 适合 QImage::Format_RGBA8888 直接显示
|
|||
|
|
BGR24, // 适合 OpenCV
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 拉流参数
|
|||
|
|
*/
|
|||
|
|
struct VrFFPullConfig
|
|||
|
|
{
|
|||
|
|
std::string rtspUrl; // rtsp://user:pass@host:port/path
|
|||
|
|
bool useTcp{true}; // true=TCP 模式,false=UDP(低延迟但容易丢包)
|
|||
|
|
bool enableVideo{true};
|
|||
|
|
bool enableAudio{false};
|
|||
|
|
|
|||
|
|
// 解码后输出:是否做 RGA 转换到 RGBA32 / BGR24,以及目标分辨率
|
|||
|
|
EFFPullPixelFormat outputFormat{EFFPullPixelFormat::RGBA32};
|
|||
|
|
unsigned int outputWidth{0}; // 0 = 跟随输入
|
|||
|
|
unsigned int outputHeight{0};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 拉流回调帧
|
|||
|
|
*/
|
|||
|
|
struct VrFFPulledFrame
|
|||
|
|
{
|
|||
|
|
const void* data{nullptr};
|
|||
|
|
size_t size{0};
|
|||
|
|
unsigned int width{0};
|
|||
|
|
unsigned int height{0};
|
|||
|
|
unsigned int stride{0}; // 一行字节数(RGBA=width*4,BGR=width*3,NV12=hstride)
|
|||
|
|
EFFPullPixelFormat format{EFFPullPixelFormat::RGBA32};
|
|||
|
|
int64_t ptsUs{0}; // PTS
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
using FFPulledFrameCallback = std::function<void(const VrFFPulledFrame&)>;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief IVrFFMediaPuller
|
|||
|
|
*
|
|||
|
|
* 基于 ffmedia_release 的 RTSP 拉流(RTSP -> MPP 解码 -> RGA 转换 -> 内存回调)。
|
|||
|
|
*
|
|||
|
|
* 典型用法:
|
|||
|
|
* IVrFFMediaPuller* puller = nullptr;
|
|||
|
|
* IVrFFMediaPuller::CreateObject(&puller);
|
|||
|
|
* puller->Init(cfg);
|
|||
|
|
* puller->SetFrameCallback([](const VrFFPulledFrame& f){ ... });
|
|||
|
|
* puller->Start();
|
|||
|
|
* ...
|
|||
|
|
* puller->Stop();
|
|||
|
|
* delete puller;
|
|||
|
|
*/
|
|||
|
|
class VR_FFMEDIA_API IVrFFMediaPuller
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
virtual ~IVrFFMediaPuller() = default;
|
|||
|
|
|
|||
|
|
static bool CreateObject(IVrFFMediaPuller** ppPuller);
|
|||
|
|
|
|||
|
|
virtual int Init(const VrFFPullConfig& config) = 0;
|
|||
|
|
|
|||
|
|
virtual void SetFrameCallback(FFPulledFrameCallback callback) = 0;
|
|||
|
|
|
|||
|
|
virtual int Start() = 0;
|
|||
|
|
virtual int Stop() = 0;
|
|||
|
|
virtual int UnInit() = 0;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 当前是否处于拉流状态
|
|||
|
|
*/
|
|||
|
|
virtual bool IsStreaming() const = 0;
|
|||
|
|
};
|