• 8270阅读
  • 11回复

Qt编写的RTSP播放器+视频监控(ffmpeg版本) [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-04-30
记得四年前就写了个简易版本的,当时写得非常粗糙,代码实在惨不忍睹,时隔多年后,重新写了个版本,同时还解决了以前不支持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

头文件:
  1. #ifndef FFMPEG_H
  2. #define FFMPEG_H
  3. /**
  4. * ffmpeg视频播放类 作者:feiyangqingyun(QQ:517216493) 2018-5-1
  5. * 1:多线程实时播放rtsp视频流
  6. * 2:支持X86和嵌入式linux
  7. * 3:多线程显示图像,不卡主界面
  8. * 4:自动重连网络摄像头
  9. * 5:可设置边框大小即偏移量和边框颜色
  10. * 6:可设置是否绘制OSD标签即标签文本或图片和标签位置
  11. * 7:可设置两种OSD位置和风格
  12. * 8:可设置是否保存到文件以及文件名
  13. * 9:可播放本地视频文件,支持设置帧率
  14. * 10:支持h265视频流+rtmp等常见视频流
  15. * 11:可暂停播放和继续播放
  16. */
  17. #include <QtGui>
  18. #include <QtNetwork>
  19. #if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
  20. #include <QtWidgets>
  21. #endif
  22. #include "libffmpeg_head.h"
  23. class FFmpegWidget;
  24. class FFmpegThread : public QThread
  25. {
  26.     Q_OBJECT
  27. public:
  28.     explicit FFmpegThread(QObject *parent = 0);
  29.     static void initlib();
  30. protected:
  31.     void run();
  32. private:
  33.     volatile bool stopped;              //线程停止标志位
  34.     volatile bool isPlay;               //播放视频标志位
  35.     volatile bool isPause;              //暂停播放标志位
  36.     volatile bool isRtsp;               //是否是视频流
  37.     QMutex mutex;                       //锁对象
  38.     QDateTime lastTime;                 //最后的消息时间
  39.     int frameCount;                     //帧数统计
  40.     int frameFinish;                    //一帧完成
  41.     int videoWidth;                     //视频宽度
  42.     int videoHeight;                    //视频高度
  43.     int oldWidth;                       //上一次视频宽度
  44.     int oldHeight;                      //上一次视频高度
  45.     int videoStreamIndex;               //视频流索引
  46.     int videoFps;                       //视频流帧率
  47.     QFile file;                         //保存文件对象
  48.     uint8_t *buffer;                    //存储解码后图片buffer
  49.     AVPacket pAVPacket;                 //包对象
  50.     AVFrame *pAVFrame, *pAVFrame2;      //帧对象
  51.     AVFormatContext *pAVFormatContext;  //格式对象
  52.     AVCodecContext *pAVCodecContext;    //解码对象
  53.     SwsContext *pSwsContext;            //处理图片数据对象
  54.     int interval;                       //采集间隔
  55.     int sleepTime;                      //休眠时间
  56.     int checkTime;                      //检测超时时间
  57.     bool checkConn;                     //检测视频流连接
  58.     bool saveFile;                      //是否保存文件
  59.     QString fileName;                   //保存文件名称
  60.     QString url;                        //视频流地址
  61. public:
  62.     //获取最后的活动时间
  63.     QDateTime getLastTime();
  64.     //获取url地址
  65.     QString getUrl();
  66. signals:
  67.     //播放成功
  68.     void receivePlayOk();
  69.     //播放失败
  70.     void receivePlayError();
  71.     //播放结束
  72.     void receivePlayFinsh();
  73.     //收到图片信号
  74.     void receiveImage(const QImage &image);
  75. public slots:
  76.     //设置显示间隔
  77.     void setInterval(int interval);
  78.     //设置休眠时间
  79.     void setSleepTime(int sleepTime);
  80.     //设置检测连接超时
  81.     void setCheckTime(int checkTime);
  82.     //设置是否检测连接
  83.     void setCheckConn(bool checkConn);
  84.     //设置是否保存文件
  85.     void setSaveFile(bool saveFile);
  86.     //设置保存文件名称
  87.     void setFileName(const QString &fileName);
  88.     //设置视频流地址
  89.     void setUrl(const QString &url);
  90.     //校验url
  91.     bool checkUrl();
  92.     //初始化视频对象
  93.     bool init();
  94.     //释放对象
  95.     void free();
  96.     //播放视频对象
  97.     void play();
  98.     //暂停播放
  99.     void pause();
  100.     //继续播放
  101.     void next();
  102.     //停止采集线程
  103.     void stop();
  104. };
  105. //实时视频显示窗体类
  106. class FFmpegWidget : public QWidget
  107. {
  108.     Q_OBJECT
  109.     Q_ENUMS(OSDFormat)
  110.     Q_ENUMS(OSDPosition)
  111.     Q_PROPERTY(bool copyImage READ getCopyImage WRITE setCopyImage)
  112.     Q_PROPERTY(bool checkLive READ getCheckLive WRITE setCheckLive)
  113.     Q_PROPERTY(bool drawImage READ getDrawImage WRITE setDrawImage)
  114.     Q_PROPERTY(bool fillImage READ getFillImage WRITE setFillImage)
  115.     Q_PROPERTY(int timeout READ getTimeout WRITE setTimeout)
  116.     Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth)
  117.     Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor)
  118.     Q_PROPERTY(QColor focusColor READ getFocusColor WRITE setFocusColor)
  119.     Q_PROPERTY(QString bgText READ getBgText WRITE setBgText)
  120.     Q_PROPERTY(QImage bgImage READ getBgImage WRITE setBgImage)
  121.     Q_PROPERTY(bool osd1Visible READ getOSD1Visible WRITE setOSD1Visible)
  122.     Q_PROPERTY(int osd1FontSize READ getOSD1FontSize WRITE setOSD1FontSize)
  123.     Q_PROPERTY(QString osd1Text READ getOSD1Text WRITE setOSD1Text)
  124.     Q_PROPERTY(QColor osd1Color READ getOSD1Color WRITE setOSD1Color)
  125.     Q_PROPERTY(QImage osd1Image READ getOSD1Image WRITE setOSD1Image)
  126.     Q_PROPERTY(OSDFormat osd1Format READ getOSD1Format WRITE setOSD1Format)
  127.     Q_PROPERTY(OSDPosition osd1Position READ getOSD1Position WRITE setOSD1Position)
  128.     Q_PROPERTY(bool osd2Visible READ getOSD2Visible WRITE setOSD2Visible)
  129.     Q_PROPERTY(int osd2FontSize READ getOSD2FontSize WRITE setOSD2FontSize)
  130.     Q_PROPERTY(QString osd2Text READ getOSD2Text WRITE setOSD2Text)
  131.     Q_PROPERTY(QColor osd2Color READ getOSD2Color WRITE setOSD2Color)
  132.     Q_PROPERTY(QImage osd2Image READ getOSD2Image WRITE setOSD2Image)
  133.     Q_PROPERTY(OSDFormat osd2Format READ getOSD2Format WRITE setOSD2Format)
  134.     Q_PROPERTY(OSDPosition osd2Position READ getOSD2Position WRITE setOSD2Position)
  135. public:
  136.     //标签格式
  137.     enum OSDFormat {
  138.         OSDFormat_Text = 0,             //文本
  139.         OSDFormat_Date = 1,             //日期
  140.         OSDFormat_Time = 2,             //时间
  141.         OSDFormat_DateTime = 3,         //日期时间
  142.         OSDFormat_Image = 4             //图片
  143.     };
  144.     //标签位置
  145.     enum OSDPosition {
  146.         OSDPosition_Left_Top = 0,       //左上角
  147.         OSDPosition_Left_Bottom = 1,    //左下角
  148.         OSDPosition_Right_Top = 2,      //右上角
  149.         OSDPosition_Right_Bottom = 3    //右下角
  150.     };
  151.     explicit FFmpegWidget(QWidget *parent = 0);
  152.     ~FFmpegWidget();
  153. protected:
  154.     void paintEvent(QPaintEvent *);
  155.     void drawBorder(QPainter *painter);
  156.     void drawBg(QPainter *painter);
  157.     void drawImg(QPainter *painter, QImage img);
  158.     void drawOSD(QPainter *painter,
  159.                  int osdFontSize,
  160.                  const QString &osdText,
  161.                  const QColor &osdColor,
  162.                  const QImage &osdImage,
  163.                  const OSDFormat &osdFormat,
  164.                  const OSDPosition &osdPosition);
  165. private:
  166.     FFmpegThread *ffmpeg;           //实时视频采集对象
  167.     QTimer *timerCheck;             //定时器检查设备是否在线
  168.     QImage image;                   //要显示的图片
  169.     bool copyImage;                 //是否拷贝图片
  170.     bool checkLive;                 //检测是否活着
  171.     bool drawImage;                 //是否绘制图片
  172.     bool fillImage;                 //自动拉伸填充
  173.     int timeout;                    //超时时间
  174.     int borderWidth;                //边框宽度
  175.     QColor borderColor;             //边框颜色
  176.     QColor focusColor;              //有焦点边框颜色
  177.     QString bgText;                 //默认无图像显示文字
  178.     QImage bgImage;                 //默认无图像背景图片
  179.     bool osd1Visible;               //显示标签1
  180.     int osd1FontSize;               //标签1字号
  181.     QString osd1Text;               //标签1文本
  182.     QColor osd1Color;               //标签1颜色
  183.     QImage osd1Image;               //标签1图片
  184.     OSDFormat osd1Format;           //标签1文本格式
  185.     OSDPosition osd1Position;       //标签1位置
  186.     bool osd2Visible;               //显示标签2
  187.     int osd2FontSize;               //标签2字号
  188.     QString osd2Text;               //标签2文本
  189.     QColor osd2Color;               //标签2颜色
  190.     QImage osd2Image;               //标签2图片
  191.     OSDFormat osd2Format;           //标签2文本格式
  192.     OSDPosition osd2Position;       //标签2位置
  193. public:
  194.     QImage getImage()               const;
  195.     QDateTime getLastTime()         const;
  196.     bool getCopyImage()             const;
  197.     bool getCheckLive()             const;
  198.     bool getDrawImage()             const;
  199.     bool getFillImage()             const;
  200.     int getTimeout()                const;
  201.     int getBorderWidth()            const;
  202.     QColor getBorderColor()         const;
  203.     QColor getFocusColor()          const;
  204.     QString getBgText()             const;
  205.     QImage getBgImage()             const;
  206.     bool getOSD1Visible()           const;
  207.     int getOSD1FontSize()           const;
  208.     QString getOSD1Text()           const;
  209.     QColor getOSD1Color()           const;
  210.     QImage getOSD1Image()           const;
  211.     OSDFormat getOSD1Format()       const;
  212.     OSDPosition getOSD1Position()   const;
  213.     bool getOSD2Visible()           const;
  214.     int getOSD2FontSize()           const;
  215.     QString getOSD2Text()           const;
  216.     QColor getOSD2Color()           const;
  217.     QImage getOSD2Image()           const;
  218.     OSDFormat getOSD2Format()       const;
  219.     OSDPosition getOSD2Position()   const;
  220. private slots:
  221.     //接收图像并绘制
  222.     void updateImage(const QImage &image);
  223.     //校验设备
  224.     void checkVideo();
  225. signals:
  226.     //播放成功
  227.     void receivePlayOk();
  228.     //播放失败
  229.     void receivePlayError();
  230.     //播放结束
  231.     void receivePlayFinsh();
  232.     //收到图片信号
  233.     void receiveImage(const QImage &image);
  234. public slots:
  235.     //设置显示间隔
  236.     void setInterval(int interval);
  237.     //设置休眠时间
  238.     void setSleepTime(int sleepTime);
  239.     //设置检测连接超时
  240.     void setCheckTime(int checkTime);
  241.     //设置是否检测连接
  242.     void setCheckConn(bool checkConn);
  243.     //设置是否保存文件
  244.     void setSaveFile(bool saveFile);
  245.     //设置保存文件名称
  246.     void setFileName(const QString &fileName);
  247.     //设置视频流地址
  248.     void setUrl(const QString &url);
  249.     //设置是否拷贝图片
  250.     void setCopyImage(bool copyImage);
  251.     //设置是否检测活着
  252.     void setCheckLive(bool checkLive);
  253.     //设置是否实时绘制图片
  254.     void setDrawImage(bool drawImage);
  255.     //设置是否拉伸填充
  256.     void setFillImage(bool fillImage);
  257.     //设置超时时间
  258.     void setTimeout(int timeout);
  259.     //设置边框宽度
  260.     void setBorderWidth(int borderWidth);
  261.     //设置边框颜色
  262.     void setBorderColor(const QColor &borderColor);
  263.     //设置有焦点边框颜色
  264.     void setFocusColor(const QColor &focusColor);
  265.     //设置无图像文字
  266.     void setBgText(const QString &bgText);
  267.     //设置无图像背景图
  268.     void setBgImage(const QImage &bgImage);
  269.     //设置标签1是否可见
  270.     void setOSD1Visible(bool osdVisible);
  271.     //设置标签1文字字号
  272.     void setOSD1FontSize(int osdFontSize);
  273.     //设置标签1文本
  274.     void setOSD1Text(const QString &osdText);
  275.     //设置标签1文字颜色
  276.     void setOSD1Color(const QColor &osdColor);
  277.     //设置标签1图片
  278.     void setOSD1Image(const QImage &osdImage);
  279.     //设置标签1格式
  280.     void setOSD1Format(const OSDFormat &osdFormat);
  281.     //设置标签1位置
  282.     void setOSD1Position(const OSDPosition &osdPosition);
  283.     //设置标签2是否可见
  284.     void setOSD2Visible(bool osdVisible);
  285.     //设置标签2文字字号
  286.     void setOSD2FontSize(int osdFontSize);
  287.     //设置标签2文本
  288.     void setOSD2Text(const QString &osdText);
  289.     //设置标签2文字颜色
  290.     void setOSD2Color(const QColor &osdColor);
  291.     //设置标签2图片
  292.     void setOSD2Image(const QImage &osdImage);
  293.     //设置标签2格式
  294.     void setOSD2Format(const OSDFormat &osdFormat);
  295.     //设置标签2位置
  296.     void setOSD2Position(const OSDPosition &osdPosition);
  297.     //打开设备
  298.     void open();
  299.     //暂停
  300.     void pause();
  301.     //继续
  302.     void next();
  303.     //关闭设备
  304.     void close();
  305.     //重新加载
  306.     void restart();
  307.     //清空
  308.     void clear();
  309. };
  310. #endif // FFMPEG_H

欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线jtl996

只看该作者 1楼 发表于: 2018-04-30
求源码学习一下!168195879@qq.com
离线uidab

只看该作者 2楼 发表于: 2018-05-01
五一都不休息,分享好东西。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线prosperouszx

只看该作者 3楼 发表于: 2018-05-01
牛掰
time is short
离线liuchangyin

只看该作者 4楼 发表于: 2018-05-02
效果不错
离线yuyu414

只看该作者 5楼 发表于: 2018-05-02
还是直接ffmpeg转码成rgb吗?太耗cpu了
离线lipanlin

只看该作者 6楼 发表于: 2018-05-06
同求源码学习一下!lipanlin@126.com
离线玖零儛

只看该作者 7楼 发表于: 2018-05-14
大师,这个开源么
离线laixiaoqi

只看该作者 8楼 发表于: 2018-06-24
大佬 求源码 学习一下 1076222731@qq.com
离线sunwf1114

只看该作者 9楼 发表于: 2018-09-22
老师,这个可以开源吗
离线huiliangshiy

只看该作者 10楼 发表于: 2018-10-18
大师,您好,能把源码发一份吗?
离线du@东方

只看该作者 11楼 发表于: 2018-10-19
1160187330@qq.com求源码学习
for QT
快速回复
限100 字节
 
上一个 下一个