操作系统: win10 64位
QT版本: QT5.12.6
编译器: MinGW 32
FFMPEG版本: 4.2.2
win32下使用FFMPEG 4.2.2库下载地址: download.csdn.net/download/xi…
完整项目源码下载地址(下载就可编译运行,不懂可以私信): download.csdn.net/download/xi…
二、功能介绍基于ffmpeg设计的视频播放器,只解码处理了图像,没有处理音频。写这个例子方便在其他平台移植播放视频。
2.1 xxx.pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
ReverseDecodThread.cpp \
VideoFrameDisplay.cpp \
main.cpp \
widget.cpp
HEADERS += \
ReverseDecodThread.h \
VideoFrameDisplay.h \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
win32
{
message('运行win32版本')
INCLUDEPATH+=C:/FFMPEG/ffmpeg_x86_4.2.2/include
LIBS+=C:/FFMPEG/ffmpeg_x86_4.2.2/bin/av*
LIBS+=C:/FFMPEG/ffmpeg_x86_4.2.2/bin/sw*
LIBS+=C:/FFMPEG/ffmpeg_x86_4.2.2/bin/pos*
}
2.2 ReverseDecodThread.cpp
2.3 ReverseDecodThread
#ifndef VIDEO_PLAY_H
#define VIDEO_PLAY_H
#include <QThread>
#include <qdebug.h>
#include <QImage>
#include <QDateTime>
extern "C" {
#include <libavutil/opt.h>
#include <libavutil/mem.h>
#include <libavutil/fifo.h>
#include <libavutil/pixfmt.h>
#include <libavutil/log.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersrc.h>
#include <libavfilter/buffersink.h>
}
//视频音频解码线程
class ReverseDecodThread: public QThread
{
Q_OBJECT
public:
//构造函数
ReverseDecodThread();
~ReverseDecodThread();
char m_MediaFile[1024];
int m_run; //1表示运行 0表示停止 2表示暂停
double m_n64CurrentSeekPos = 0; //当前seek位置
bool is_CurrentSeekPos = 0; //1需要跳转 0不需要
void SetSate(int run);
int GetSate();
void SetSeekPos(qint64 pos);
void PausePlay();
void StopPlay();
void LogSend(QString text);
//加载视频文件
int LoadVideoFile(QString media);
//释放内存
void FreeRAM();
protected:
void run();
int StartPlay();
signals:
void sig_getCurrentTime(double Sec, double total_Sec);
void VideoDataOutput(QImage); //输出信号
private:
int video_width=0;
int video_height=0;
AVFormatContext *format_ctx=nullptr;
int video_stream_index = -1;
AVFrame *RGB24_pFrame = nullptr;
AVFrame *SRC_VIDEO_pFrame= nullptr;
uint8_t *out_buffer_rgb= nullptr;
struct SwsContext *img_convert_ctx=nullptr; //用于解码后的视频格式转换
double video_clock_tmp;
qint64 play_base_time=0;
};
#endif // VIDEO_PLAY_H
2.3 效果