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.
PayloadAPP/Src/Video/cffmpeg_decode.h

113 lines
2.9 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 CFFMPEG_DECODE_H
#define CFFMPEG_DECODE_H
#include "ffmpeginclude.h"
#include <QCoreApplication>
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QImage>
#include <QMutex>
#include <QPaintEvent>
#include <QPainter>
#include <QThread>
#include <QWidget>
// class Cffmpeg_decode: public QThread
class Cffmpeg_decode : public QObject {
Q_OBJECT
public:
// explicit Cffmpeg_decode();
Cffmpeg_decode(QObject *parent = nullptr);
~Cffmpeg_decode();
bool open_input_file();
void stop();
/**
* @brief 设置拉流保存文件夹路径
* @param fileDirPath 文件夹路径
*/
void setSaveFileDirPath(QString fileDirPath);
void setFlowType(QString); // 设置拉流打开方式
void setStreamUrl(QString url);
public slots:
void run();
void setPlayVideo(bool bPlay);
void setPushStream(bool bPushStream);
signals:
void sendQImage(QImage);
void sendConnectFail(int);
void sendInitPushStream_Signal(AVFormatContext *inputFormatCtx);
void sendStreamData_Signal(AVPacket *pkt, int frm_cnt, int64_t startTime,
int64_t firstDts);
void sendStopPushStream_Signal();
public:
QMutex mutex;
bool IsstopPlay = false;
bool bPushStreamFlag = false; // 推流标志
bool bPlayVideoFlag = false; // 播放视频标志
private:
bool bOpenPushStreamFlag = false; // 推流初始化
AVFormatContext *inputFormatCtx = NULL; //
AVCodecContext *decoderCtx = NULL; //
AVCodecContext *encoderCtx = NULL; //
const AVCodec *decoder = NULL; // 解码器
AVPacket *inputPacket = NULL; //
AVFrame *yuvFrame = NULL;
AVFrame *rgbFrame = NULL;
struct SwsContext *swsCtx = NULL; // 图像转换上下文
AVCodecParameters *videoCodecPara = nullptr;
unsigned char *out_buffer = nullptr;
int videoStreamIndex = -1;
int numBytes = -1;
int frm_cnt = 0;
QString _url;
QString saveFileDirPath;
bool bRecordTime = true;
// 推流使用
int64_t startTime;
int64_t firstDts;
// 初始化 previous_pts_time 为无效值(拉流使用)
double previous_pts_time; // 表示没有上一帧的时间戳
double first_frame_pts_time; // 第一帧的 PTS 时间
double first_frame_system_time; // 第一帧解码时的系统时间
/******** 保存裸流使用 ******************/
AVFormatContext *m_formatContextSave = nullptr; // 封装上下文
QString m_strCodecName; // 编解码器名称
AVStream *m_videoStreamOut = nullptr; // 输出视频流
bool m_writeHeader = false; // 是否写入文件头
QString m_rtsp_transport; // 拉流打开方式UDP或TCP
bool m_bSetRtspTransport = false;
private:
bool m_saveVideoFlag = false;
/**
* @brief 打开视频保存文件
* @return
*/
bool openSave();
/**
* @brief 视频保存成功,释放资源
*/
void saveDone();
};
#endif // CFFMPEG_DECODE_H