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

91 lines
2.0 KiB
C++

#ifndef CFFMPEG_DECODE_H
#define CFFMPEG_DECODE_H
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QImage>
#include <QPaintEvent>
#include <QPainter>
#include <QThread>
#include <QWidget>
extern "C" {
#include "libavcodec/avcodec.h"
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/frame.h>
#include <libavutil/imgutils.h>
#include <libavutil/mem.h>
#include <libavutil/opt.h>
#include <libavutil/parseutils.h>
#include <libavutil/samplefmt.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
}
// class Cffmpeg_decode: public QThread
class Cffmpeg_decode : public QObject {
Q_OBJECT
public:
// explicit Cffmpeg_decode();
Cffmpeg_decode(QObject *parent = nullptr);
~Cffmpeg_decode();
public:
bool open_input_file();
bool IsstopPlay = false;
void stop();
/**
* @brief 设置拉流保存文件夹路径
* @param fileDirPath 文件夹路径
*/
void setSaveFileDirPath(QString fileDirPath);
public slots:
void run();
void setUrl(QString url);
signals:
void sendQImage(QImage);
void sendConnectFail(int);
private:
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 videoStreamIndexOut = -1;
int numBytes = -1;
QString _url;
QString saveFileDirPath;
/******** 保存裸流使用 ******************/
AVFormatContext *m_formatContextSave = nullptr; // 封装上下文
QString m_strCodecName; // 编解码器名称
AVStream *m_videoStreamOut = nullptr; // 输出视频流
bool m_writeHeader = false; // 是否写入文件头
private:
bool openSave();
void saveDone();
};
#endif // CFFMPEG_DECODE_H