#pragma once #include "VideoEncoderBase.h" #include "common/config.h" #include #include // 合规守护:DISABLE_FFMPEG_FOR_TEST=1 时整类移出编译单元,避免 GPL 传染(与 c0a632a 对齐) #if defined(_WIN64) && !DISABLE_FFMPEG_FOR_TEST struct AVCodecContext; struct AVFrame; struct AVPacket; // FFmpeg 硬编 H.264 实现。 // Step 1: 仅探测 h264_nvenc 单后端,足以验证 FFmpeg 静态库集成链路。 // Step 2: 扩展 h264_qsv / h264_amf / h264_mf。 // // 输入像素:BGRA (bpp=32) / RGB24 (bpp=24),与 CX264Encoder 完全一致; // 内部转 NV12 喂给 FFmpeg encoder。 class CFFmpegH264Encoder : public VideoEncoderBase { public: CFFmpegH264Encoder(); ~CFFmpegH264Encoder() override; bool open(const EncoderParams& params) override; void close() override; int encode( uint8_t* rgb, uint8_t bpp, uint32_t stride, uint32_t width, uint32_t height, uint8_t** lppData, uint32_t* lpSize, int direction = 1 ) override; void forceIDR() override { m_forceIDR = true; } void setBitrate(int kbps) override; VideoCodec codec() const override { return VideoCodec::H264; } const char* backendName() const override { return m_backend.c_str(); } private: bool tryOpenBackend(const char* name, const EncoderParams& p); void cleanupCodec(); int convertRGB24ToNV12(uint8_t* rgb, uint32_t stride, uint32_t width, uint32_t height, int direction); AVCodecContext* m_ctx = nullptr; AVFrame* m_frame = nullptr; AVPacket* m_packet = nullptr; std::vector m_outputBuffer; // encode 返回给调用方的缓冲(持有到下一次 encode) std::vector m_i420Scratch; // RGB24 路径的中间缓冲 int64_t m_pts = 0; bool m_forceIDR = false; std::string m_backend; // 实际选中的后端名("h264_nvenc" / ...) }; #endif // _WIN64 && !DISABLE_FFMPEG_FOR_TEST