基于QT和FFmpeg开发流媒体播放器对H.264码流进行解码播放

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)
    {
     
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值