#ifndef NMFFMPEGVIDEOWRITER_H #define NMFFMPEGVIDEOWRITER_H #include "nmSubWxs_global.h" #include #include /** @brief 使用项目固定FFmpeg 1.1 DLL编码RGB24视频。 */ class NM_SUB_WXS_EXPORT nmFFmpegVideoWriter { public: /** @brief 打开视频编码器所需的规范化参数。 */ struct VideoSettings { /** @brief 创建尚未指定文件、尺寸和帧率的空参数。 */ VideoSettings(); /** @brief Writer规范为绝对路径后写入,并在失败或取消时删除的临时文件。 */ QString m_sTemporaryFilePath; /** @brief 决定固定容器和编码器组合的扩展名,可带或不带点号。 */ QString m_sFileExtension; /** @brief 输出宽度,单位为像素,必须是2~8192之间的偶数。 */ int m_nWidth; /** @brief 输出高度,单位为像素,必须是2~8192之间的偶数。 */ int m_nHeight; /** @brief 视频帧率,正式有效范围为1~5000 FPS。 */ int m_nFramesPerSecond; }; /** @brief 创建尚未打开编码会话的Writer。 */ nmFFmpegVideoWriter(); /** @brief 析构Writer;仍在编码时按取消路径清理临时文件。 */ ~nmFFmpegVideoWriter(); /** * @brief 创建编码器并打开临时文件;失败时不会留下半成品。 * @param oSettings 已规范化的视频参数。 * @param pError 可选错误输出;进入函数后先清空。 * @return 编码器、容器和自定义文件IO全部初始化成功时返回true。 */ bool open(const VideoSettings& oSettings, QString* pError = nullptr); /** * @brief 写入一帧RGB24数据,stride允许包含行尾填充。 * @param pData 输入帧首地址,只在本次调用期间读取。 * @param nStride 每行字节数,不得小于宽度乘3。 * @param bBottomUp 为true时首地址对应图像底行,Writer负责垂直翻转。 * @param pError 可选错误输出;进入函数后先清空。 * @return 完整帧成功交给编码器和Muxer时返回true。 */ bool writeRgb24Frame(const unsigned char* pData, int nStride, bool bBottomUp, QString* pError = nullptr); /** * @brief 刷新编码器并写完容器;成功后临时文件才可发布。 * @param pError 可选错误输出;进入函数后先清空。 * @return Trailer、IO刷新和非空文件校验全部成功时返回true。 */ bool finish(QString* pError = nullptr); /** @brief 中止编码并删除Writer拥有的临时文件。 */ void cancel(); /** * @brief 校验固定DLL主版本及全部正式格式组合是否可用。 * @param pError 可选错误输出;失败时说明具体版本、格式或组件。 * @return 八种正式格式全部可用时返回true。 */ static bool isBackendAvailable(QString* pError = nullptr); /** @brief 返回正式支持的八种文件扩展名,均不包含点号。 */ static QStringList getSupportedExtensions(); /** @brief 判断扩展名是否属于正式格式,比较时忽略大小写和前导点号。 */ static bool isSupportedExtension(const QString& sExtension); private: Q_DISABLE_COPY(nmFFmpegVideoWriter) /** @brief 隔离FFmpeg头文件和编码资源的私有实现。 */ class Private; /** @brief Writer独占的状态、FFmpeg对象及临时文件资源。 */ Private* m_pPrivate; }; #endif // NMFFMPEGVIDEOWRITER_H