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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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