文档章节

Qt编写的RTSP播放器+视频监控(ffmpeg版本)

飞扬青云
 飞扬青云
发布于 2018/07/17 22:14
字数 2249
阅读 303
收藏 0

记得四年前就写了个简易版本的,当时写得非常粗糙,代码实在惨不忍睹,时隔多年后,重新写了个版本,同时还解决了以前不支持6画面8画面切换等异形布局的问题。
1:可以用过目录下的rtsp.txt设置要显示的视频流地址。
2:支持4画面+6画面+8画面+9画面+16画面切换。
3:支持双击最大化当前画面。
4:支持右键截图。
5:支持各种视频流和本地文件播放。
6:可设置OSD标签。
7:在所有可能测试的操作系统和平台上均编译通过并完美运行。
8:XP运行报错的话请执行目录下的fixff.cmd即可。

/**
* ffmpeg视频播放类 作者:feiyangqingyun(QQ:517216493) 2018-5-1
* 1:多线程实时播放rtsp视频流
* 2:支持X86和嵌入式linux
* 3:多线程显示图像,不卡主界面
* 4:自动重连网络摄像头
* 5:可设置边框大小即偏移量和边框颜色
* 6:可设置是否绘制OSD标签即标签文本和标签位置
* 7:可设置两种OSD位置和风格
* 8:可设置是否保存到文件以及文件名
* 9:可播放本地视频文件,支持设置帧率
* 10:支持h265视频流+rtmp等常见视频流
*/

/**
* USB摄像机采集类 作者:feiyangqingyun(QQ:517216493) 2018-5-1
* 1:可获取摄像机实时视频
* 2:支持X86和嵌入式linux
* 3:多线程显示图像,不卡主界面
* 4:自动重连USB摄像头
* 5:可设置边框大小即偏移量和边框颜色
* 6:可设置是否绘制OSD标签即标签文本和标签位置
* 7:可设置两种OSD位置和风格
* 8:可设置是否显示实时人脸框
* 9:可设置查找当前图片内的最大相似人脸
*/

可执行文件下载:https://pan.baidu.com/s/1hllkPoc6DJ8O4clVm1U6-g

头文件代码

#ifndef FFMPEG_H
#define FFMPEG_H

/**
 * ffmpeg视频播放类 作者:feiyangqingyun(QQ:517216493) 2018-5-1
 * 1:多线程实时播放rtsp视频流
 * 2:支持X86和嵌入式linux
 * 3:多线程显示图像,不卡主界面
 * 4:自动重连网络摄像头
 * 5:可设置边框大小即偏移量和边框颜色
 * 6:可设置是否绘制OSD标签即标签文本或图片和标签位置
 * 7:可设置两种OSD位置和风格
 * 8:可设置是否保存到文件以及文件名
 * 9:可播放本地视频文件,支持设置帧率
 * 10:支持h265视频流+rtmp等常见视频流
 * 11:可暂停播放和继续播放
 */

#include <QtGui>
#include <QtNetwork>
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif

#include "libffmpeg_head.h"

class FFmpegWidget;

class FFmpegThread : public QThread
{
    Q_OBJECT
public:
    explicit FFmpegThread(QObject *parent = 0);
    static void initlib();

protected:
    void run();

private:
    volatile bool stopped;              //线程停止标志位
    volatile bool isPlay;               //播放视频标志位
    volatile bool isPause;              //暂停播放标志位
    volatile bool isRtsp;               //是否是视频流

    QMutex mutex;                       //锁对象
    QDateTime lastTime;                 //最后的消息时间
    int frameCount;                     //帧数统计
    int frameFinish;                    //一帧完成
    int videoWidth;                     //视频宽度
    int videoHeight;                    //视频高度
    int oldWidth;                       //上一次视频宽度
    int oldHeight;                      //上一次视频高度
    int videoStreamIndex;               //视频流索引
    int videoFps;                       //视频流帧率

    QFile file;                         //保存文件对象
    uint8_t *buffer;                    //存储解码后图片buffer
    AVPacket pAVPacket;                 //包对象
    AVFrame *pAVFrame, *pAVFrame2;      //帧对象
    AVFormatContext *pAVFormatContext;  //格式对象
    AVCodecContext *pAVCodecContext;    //解码对象
    SwsContext *pSwsContext;            //处理图片数据对象

    int interval;                       //采集间隔
    int sleepTime;                      //休眠时间
    int checkTime;                      //检测超时时间
    bool checkConn;                     //检测视频流连接
    bool saveFile;                      //是否保存文件
    QString fileName;                   //保存文件名称
    QString url;                        //视频流地址

public:
    //获取最后的活动时间
    QDateTime getLastTime();
    //获取url地址
    QString getUrl();

signals:
    //播放成功
    void receivePlayOk();
    //播放失败
    void receivePlayError();
    //播放结束
    void receivePlayFinsh();

    //收到图片信号
    void receiveImage(const QImage &image);

public slots:
    //设置显示间隔
    void setInterval(int interval);

    //设置休眠时间
    void setSleepTime(int sleepTime);

    //设置检测连接超时
    void setCheckTime(int checkTime);
    //设置是否检测连接
    void setCheckConn(bool checkConn);

    //设置是否保存文件
    void setSaveFile(bool saveFile);
    //设置保存文件名称
    void setFileName(const QString &fileName);

    //设置视频流地址
    void setUrl(const QString &url);

    //校验url
    bool checkUrl();

    //初始化视频对象
    bool init();

    //释放对象
    void free();

    //播放视频对象
    void play();

    //暂停播放
    void pause();

    //继续播放
    void next();

    //停止采集线程
    void stop();

};

//实时视频显示窗体类
class FFmpegWidget : public QWidget
{
    Q_OBJECT
    Q_ENUMS(OSDFormat)
    Q_ENUMS(OSDPosition)

    Q_PROPERTY(bool copyImage READ getCopyImage WRITE setCopyImage)
    Q_PROPERTY(bool checkLive READ getCheckLive WRITE setCheckLive)
    Q_PROPERTY(bool drawImage READ getDrawImage WRITE setDrawImage)
    Q_PROPERTY(bool fillImage READ getFillImage WRITE setFillImage)
    Q_PROPERTY(int timeout READ getTimeout WRITE setTimeout)
    Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth)
    Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor)
    Q_PROPERTY(QColor focusColor READ getFocusColor WRITE setFocusColor)
    Q_PROPERTY(QString bgText READ getBgText WRITE setBgText)
    Q_PROPERTY(QImage bgImage READ getBgImage WRITE setBgImage)

    Q_PROPERTY(bool osd1Visible READ getOSD1Visible WRITE setOSD1Visible)
    Q_PROPERTY(int osd1FontSize READ getOSD1FontSize WRITE setOSD1FontSize)
    Q_PROPERTY(QString osd1Text READ getOSD1Text WRITE setOSD1Text)
    Q_PROPERTY(QColor osd1Color READ getOSD1Color WRITE setOSD1Color)
    Q_PROPERTY(QImage osd1Image READ getOSD1Image WRITE setOSD1Image)
    Q_PROPERTY(OSDFormat osd1Format READ getOSD1Format WRITE setOSD1Format)
    Q_PROPERTY(OSDPosition osd1Position READ getOSD1Position WRITE setOSD1Position)

    Q_PROPERTY(bool osd2Visible READ getOSD2Visible WRITE setOSD2Visible)
    Q_PROPERTY(int osd2FontSize READ getOSD2FontSize WRITE setOSD2FontSize)
    Q_PROPERTY(QString osd2Text READ getOSD2Text WRITE setOSD2Text)
    Q_PROPERTY(QColor osd2Color READ getOSD2Color WRITE setOSD2Color)
    Q_PROPERTY(QImage osd2Image READ getOSD2Image WRITE setOSD2Image)
    Q_PROPERTY(OSDFormat osd2Format READ getOSD2Format WRITE setOSD2Format)
    Q_PROPERTY(OSDPosition osd2Position READ getOSD2Position WRITE setOSD2Position)

public:
    //标签格式
    enum OSDFormat {
        OSDFormat_Text = 0,             //文本
        OSDFormat_Date = 1,             //日期
        OSDFormat_Time = 2,             //时间
        OSDFormat_DateTime = 3,         //日期时间
        OSDFormat_Image = 4             //图片
    };

    //标签位置
    enum OSDPosition {
        OSDPosition_Left_Top = 0,       //左上角
        OSDPosition_Left_Bottom = 1,    //左下角
        OSDPosition_Right_Top = 2,      //右上角
        OSDPosition_Right_Bottom = 3    //右下角
    };

    explicit FFmpegWidget(QWidget *parent = 0);
    ~FFmpegWidget();

protected:
    void paintEvent(QPaintEvent *);
    void drawBorder(QPainter *painter);
    void drawBg(QPainter *painter);
    void drawImg(QPainter *painter, QImage img);
    void drawOSD(QPainter *painter,
                 int osdFontSize,
                 const QString &osdText,
                 const QColor &osdColor,
                 const QImage &osdImage,
                 const OSDFormat &osdFormat,
                 const OSDPosition &osdPosition);

private:
    FFmpegThread *ffmpeg;           //实时视频采集对象
    QTimer *timerCheck;             //定时器检查设备是否在线
    QImage image;                   //要显示的图片

    bool copyImage;                 //是否拷贝图片
    bool checkLive;                 //检测是否活着
    bool drawImage;                 //是否绘制图片
    bool fillImage;                 //自动拉伸填充
    int timeout;                    //超时时间
    int borderWidth;                //边框宽度
    QColor borderColor;             //边框颜色
    QColor focusColor;              //有焦点边框颜色
    QString bgText;                 //默认无图像显示文字
    QImage bgImage;                 //默认无图像背景图片

    bool osd1Visible;               //显示标签1
    int osd1FontSize;               //标签1字号
    QString osd1Text;               //标签1文本
    QColor osd1Color;               //标签1颜色
    QImage osd1Image;               //标签1图片
    OSDFormat osd1Format;           //标签1文本格式
    OSDPosition osd1Position;       //标签1位置

    bool osd2Visible;               //显示标签2
    int osd2FontSize;               //标签2字号
    QString osd2Text;               //标签2文本
    QColor osd2Color;               //标签2颜色
    QImage osd2Image;               //标签2图片
    OSDFormat osd2Format;           //标签2文本格式
    OSDPosition osd2Position;       //标签2位置

public:
    QImage getImage()               const;
    QDateTime getLastTime()         const;

    bool getCopyImage()             const;
    bool getCheckLive()             const;
    bool getDrawImage()             const;
    bool getFillImage()             const;
    int getTimeout()                const;
    int getBorderWidth()            const;
    QColor getBorderColor()         const;
    QColor getFocusColor()          const;
    QString getBgText()             const;
    QImage getBgImage()             const;

    bool getOSD1Visible()           const;
    int getOSD1FontSize()           const;
    QString getOSD1Text()           const;
    QColor getOSD1Color()           const;
    QImage getOSD1Image()           const;
    OSDFormat getOSD1Format()       const;
    OSDPosition getOSD1Position()   const;

    bool getOSD2Visible()           const;
    int getOSD2FontSize()           const;
    QString getOSD2Text()           const;
    QColor getOSD2Color()           const;
    QImage getOSD2Image()           const;
    OSDFormat getOSD2Format()       const;
    OSDPosition getOSD2Position()   const;

private slots:
    //接收图像并绘制
    void updateImage(const QImage &image);
    //校验设备
    void checkVideo();

signals:
    //播放成功
    void receivePlayOk();
    //播放失败
    void receivePlayError();
    //播放结束
    void receivePlayFinsh();

    //收到图片信号
    void receiveImage(const QImage &image);

public slots:
    //设置显示间隔
    void setInterval(int interval);
    //设置休眠时间
    void setSleepTime(int sleepTime);
    //设置检测连接超时
    void setCheckTime(int checkTime);
    //设置是否检测连接
    void setCheckConn(bool checkConn);
    //设置是否保存文件
    void setSaveFile(bool saveFile);
    //设置保存文件名称
    void setFileName(const QString &fileName);
    //设置视频流地址
    void setUrl(const QString &url);

    //设置是否拷贝图片
    void setCopyImage(bool copyImage);
    //设置是否检测活着
    void setCheckLive(bool checkLive);
    //设置是否实时绘制图片
    void setDrawImage(bool drawImage);
    //设置是否拉伸填充
    void setFillImage(bool fillImage);
    //设置超时时间
    void setTimeout(int timeout);
    //设置边框宽度
    void setBorderWidth(int borderWidth);
    //设置边框颜色
    void setBorderColor(const QColor &borderColor);
    //设置有焦点边框颜色
    void setFocusColor(const QColor &focusColor);
    //设置无图像文字
    void setBgText(const QString &bgText);
    //设置无图像背景图
    void setBgImage(const QImage &bgImage);

    //设置标签1是否可见
    void setOSD1Visible(bool osdVisible);
    //设置标签1文字字号
    void setOSD1FontSize(int osdFontSize);
    //设置标签1文本
    void setOSD1Text(const QString &osdText);
    //设置标签1文字颜色
    void setOSD1Color(const QColor &osdColor);
    //设置标签1图片
    void setOSD1Image(const QImage &osdImage);
    //设置标签1格式
    void setOSD1Format(const OSDFormat &osdFormat);
    //设置标签1位置
    void setOSD1Position(const OSDPosition &osdPosition);

    //设置标签2是否可见
    void setOSD2Visible(bool osdVisible);
    //设置标签2文字字号
    void setOSD2FontSize(int osdFontSize);
    //设置标签2文本
    void setOSD2Text(const QString &osdText);
    //设置标签2文字颜色
    void setOSD2Color(const QColor &osdColor);
    //设置标签2图片
    void setOSD2Image(const QImage &osdImage);
    //设置标签2格式
    void setOSD2Format(const OSDFormat &osdFormat);
    //设置标签2位置
    void setOSD2Position(const OSDPosition &osdPosition);

    //打开设备
    void open();
    //暂停
    void pause();
    //继续
    void next();
    //关闭设备
    void close();
    //重新加载
    void restart();
    //清空
    void clear();

};

#endif // FFMPEG_H

 

© 著作权归作者所有

飞扬青云
粉丝 53
博文 108
码字总数 219717
作品 0
徐汇
程序员
私信 提问
ONVIF协议网络摄像机(IPC)客户端程序开发(12):读取音视频流

1 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代码段),后面文章不会赘述。为了节省篇幅,突出重点,在文...

benkaoya
2017/05/19
0
0
Ubuntu16.04 安装ffmpeg 实现视频流解析

一.ffmpeg安装 第一步:添加源。 第二步:更新源。 第三步:下载安装。 第四步:验证。 二.C语言调用ffmpeg库实现rtsp视频流解析并存储为ppm格式图片 1.参考: https://stackoverflow.com/qu...

mecisery
2018/10/09
518
0
最简单的基于FFmpeg的移动端例子:IOS HelloWorld

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/47071547 ===================================================== 最简单的...

雷霄骅
2015/07/27
0
0
ckplayer播放器解决MP4文件缓冲结束前无法播放的方法

最近给客户上传mp4的视频,发现不下载完成,不会播放,查了下,视频要等加载完才能播放,而不是边加载边播放这是因为视频的元数据信息不在第一帧所致。元数据是指保存视频属性的一组参数,比...

likeni1314
2017/05/10
0
0
Android使用FFmpeg(五)--ffmpeg实现音频播放(使用openSL ES进行播放)

关于 Android使用FFmpeg(一)--编译ffmpeg Android使用FFmpeg(二)--Android Studio配置ffmpeg Android使用FFmpeg(三)--ffmpeg实现视频播放 Android使用FFmpeg(四)--ffmpeg实现音频播放(使用A...

天王盖地虎626
01/14
11
0

没有更多内容

加载失败,请刷新页面

加载更多

Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
25分钟前
2
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
6
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
1
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
5
0
OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
2.8K
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部