You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmSubWxs/nmFFmpegVideoWriter.h

90 lines
3.5 KiB
C

#ifndef NMFFMPEGVIDEOWRITER_H
#define NMFFMPEGVIDEOWRITER_H
#include "nmSubWxs_global.h"
#include <QString>
#include <QStringList>
/** @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