1.上位机界面展示
- 双击最大化
- 三通道同步
- 截图
2.QFFmpeg类 解码相关
#ifndef QFFMPEG_H
#define QFFMPEG_H
//必须加以下内容,否则编译不能通过,为了兼容C和C99标准
#ifndef INT64_C
#define INT64_C
#define UINT64_C
#endif
//引入ffmpeg头文件
//由于我们建立的是C++的工程
//编译的时候使用的C++的编译器编译
//而FFMPEG是C的库
//表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约
//因此这里需要加上extern "C"
//否则会提示各种未定义
extern "C"
{
#include <libavcodec/avcodec.h> //编解码模块
#include <libavformat/avformat.h> //封装模块
#include <libavfilter/avfilter.h> //滤镜模块
#include <libswscale/swscale.h> //视频图像转换计算模块
#include <libavutil/frame.h>
}
#include <QObject>
#include <QMutex>
#include <QImage>
class QFFmpeg : public QObject
{
Q_OBJECT
private:
QMutex mutex;//互斥锁
//ffmpeg需要用到的变量
AVPicture pAVPicture;//图片数据结构
//就是对容器或者媒体文件层次的抽象, 容器/文件(Container/File):即特定格式的多媒体文件,比如MP4,flv,mov等
AVFormatContext *pAVFormatContext;
//在每一路流中都会描述这路流的编码格式,对编解码器格式以及编解码器的抽象就是AVCodecContext 与 AVCodec。
AVCodecContext *pAVCodecContext;
AVCodec *pAVCodec;//编解码器
AVFrame *pAVFrame;//一般用于存储原始数据 即非压缩数据,例如对视频来说是YUV,RGB
SwsContext *pSwsContext;
AVPacket pAVPacket;//AVPacket通常包含一个压缩的Frame
QString url;
int videoWidth;
int videoHeight;
int videoStreamIndex;
public:
explicit QFFmpeg(QObject *parent = nullptr);//禁止隐式转换
~QFFmpeg();
bool Init();
void Play();
void SetUrl(QString url)
{
this->url = url;
}
QString Url() const
{
return url;
}
int VideoWidth() const
{
return videoWidth;
}
int VideoHeight() const
{
return videoStreamIndex;
}
//自定义信号 只能声明不能定义
signals:
void GetImage(const QImage &image);
public slots:
};
#endif // QFFMPEG_H
构造函数
QFFmpeg::QFFmpeg(QObject *parent) : QObject(parent)
{
videoStreamIndex = -1;
av_register_all();//注册库中所有可用的文件格式和解码器
avformat_network_init();//初始化网络流格式,使用RTSP网络流时必须先执行
pAVFormatContext = avformat_alloc_context();//申请一个AVFormatContext结构的内存,并进行简单初始化
pAVFrame = av_frame_alloc();
}
析构函数
QFFmpeg::~QFFmpeg()
{
avformat_free_context(pAVFormatContext);
av_frame_free(&pAVFrame);
sws_freeContext(pSwsContext);
}
Init()
-
打开视频流
-
获取视频流
-
获取视频流索引
-
获取视频流的分辨率大小
-
获取视频流解码器
-
打开对应解码器
bool QFFmpeg::Init()
{
//1.打开视频流
int result = avformat_open_input(&pAVFormatContext, url.toStdString().c_str(), nullptr, nullptr);
if(result < 0)
{
qDebug() << " 打开视频流失败 ";
return false;
}
//2.获取视频流
//avformat_open_input可能得不到解码所需要的必要信息,需要调用avformat_find_stream_info进一步得到流的信息
result = avformat_find_stream_info(pAVFormatContext, nullptr);
if(result < 0)
{