#ifndef CFFMPEG_DECODE_H #define CFFMPEG_DECODE_H #include #include #include #include #include #include #include #include extern "C" { #include "libavcodec/avcodec.h" #include #include #include #include #include #include #include #include #include #include } // 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