|
|
#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
|