• 6738阅读
  • 5回复

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

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-05-03
前几天写了个ffmpeg版本,今天特意抽空改写个vlc版本,之前vlc播放视频后,被接管了不能识别到鼠标,需要重新编译vlc源码得到支持鼠标消息的版本。

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

window.open('http://www.qtcn.org/bbs/attachment/Mon_1807/44_110085_b31558552184eb0.jpg?178');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >




可执行文件下载:https://pan.baidu.com/s/18qX9cGfC9V0-ADmQ6vus_A
头文件代码
  1. #ifndef VLC_H
  2. #define VLC_H
  3. #include <QtGui>
  4. #include <QtNetwork>
  5. #if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
  6. #include <QtWidgets>
  7. #endif
  8. #include "libvlc_head.h"
  9. class VlcWidget;
  10. class VlcObject : public QObject
  11. {
  12.     Q_OBJECT
  13. public:
  14.     enum VlcState {
  15.         VlcState_NothingSpecial = 0,
  16.         VlcState_Opening = 1,
  17.         VlcState_Buffering = 2,
  18.         VlcState_Playing = 3,
  19.         VlcState_Paused = 4,
  20.         VlcState_Stopped = 5,
  21.         VlcState_Ended = 6,
  22.         VlcState_Error = 7
  23.     };
  24.     explicit VlcObject(QObject *parent = 0);
  25. private:
  26.     QMutex mutex;                       //锁对象
  27.     QDateTime lastTime;                 //最后的消息时间
  28.     bool isRtsp;                        //是否是视频流
  29.     libvlc_instance_t *vlcInst;         //载体对象
  30.     libvlc_media_t *vlcMedia;           //媒体对象
  31.     libvlc_media_player_t *vlcPlayer;   //播放对象
  32.     int videoWidth;                     //视频宽度
  33.     int videoHeight;                    //视频高度
  34.     int checkTime;                      //检测超时时间
  35.     bool checkConn;                     //检测视频流连接
  36.     bool saveFile;                      //是否保存文件
  37.     QString fileName;                   //保存文件名称
  38.     QString url;                        //视频流地址
  39.     QString suffix;                     //拓展名
  40. public:
  41.     //获取最后的活动时间
  42.     QDateTime getLastTime();
  43.     //获取url地址
  44.     QString getUrl();
  45.     //快照
  46.     void snap(const QString &fileName, int width = 640, int height = 480);
  47.     //设置参数
  48.     void setOption(const QString &args);
  49.     //设置视频宽高比例
  50.     void setSize(int width, int height);
  51.     //获取是否正在播放
  52.     bool getIsPlaying();
  53.     //获取当前状态
  54.     VlcState getState();
  55.     //获取长度
  56.     uint getLength();
  57.     //获取当前播放位置
  58.     uint getPosition();
  59.     //设置播放位置
  60.     void setPosition(int position);
  61.     //获取静音状态
  62.     bool getMute();
  63.     //设置静音
  64.     void setMute(bool mute);
  65.     //获取音量
  66.     int getVolumn();
  67.     //设置音量
  68.     void setVolumn(int volumn);
  69.     //获取音轨
  70.     int getTrack();
  71.     //获取音轨数量
  72.     int getTrackCount();
  73.     //设置音轨
  74.     void setTrack(int track);
  75. signals:
  76.     //播放成功
  77.     void receivePlayOk();
  78.     //播放失败
  79.     void receivePlayError();
  80.     //播放结束
  81.     void receivePlayFinsh();
  82.     //收到图片信号
  83.     void receiveImage(const QImage &image);
  84. public slots:
  85.     //设置视频宽度
  86.     void setVideoWidth(int videoWidth);
  87.     //设置视频高度
  88.     void setVideoHeight(int videoHeight);
  89.     //设置检测连接超时
  90.     void setCheckTime(int checkTime);
  91.     //设置是否检测连接
  92.     void setCheckConn(bool checkConn);
  93.     //设置是否保存文件
  94.     void setSaveFile(bool saveFile);
  95.     //设置保存文件名称
  96.     void setFileName(const QString &fileName);
  97.     //设置视频流地址
  98.     void setUrl(const QString &url);
  99.     //校验url
  100.     bool checkUrl();
  101.     //初始化视频对象
  102.     bool init();
  103.     //播放视频对象
  104.     bool play();
  105.     //暂停播放
  106.     void pause();
  107.     //继续播放
  108.     void next();
  109.     //释放对象
  110.     void free();
  111.     //停止采集线程
  112.     void stop();
  113. };
  114. //实时视频显示窗体类
  115. class VlcWidget : public QWidget
  116. {
  117.     Q_OBJECT
  118.     Q_ENUMS(OSDFormat)
  119.     Q_ENUMS(OSDPosition)
  120.     Q_PROPERTY(bool copyImage READ getCopyImage WRITE setCopyImage)
  121.     Q_PROPERTY(bool checkLive READ getCheckLive WRITE setCheckLive)
  122.     Q_PROPERTY(bool drawImage READ getDrawImage WRITE setDrawImage)
  123.     Q_PROPERTY(bool fillImage READ getFillImage WRITE setFillImage)
  124.     Q_PROPERTY(int timeout READ getTimeout WRITE setTimeout)
  125.     Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth)
  126.     Q_PROPERTY(QColor borderColor READ getBorderColor WRITE setBorderColor)
  127.     Q_PROPERTY(QColor focusColor READ getFocusColor WRITE setFocusColor)
  128.     Q_PROPERTY(QString bgText READ getBgText WRITE setBgText)
  129.     Q_PROPERTY(QImage bgImage READ getBgImage WRITE setBgImage)
  130.     Q_PROPERTY(bool osd1Visible READ getOSD1Visible WRITE setOSD1Visible)
  131.     Q_PROPERTY(int osd1FontSize READ getOSD1FontSize WRITE setOSD1FontSize)
  132.     Q_PROPERTY(QString osd1Text READ getOSD1Text WRITE setOSD1Text)
  133.     Q_PROPERTY(QColor osd1Color READ getOSD1Color WRITE setOSD1Color)
  134.     Q_PROPERTY(QImage osd1Image READ getOSD1Image WRITE setOSD1Image)
  135.     Q_PROPERTY(OSDFormat osd1Format READ getOSD1Format WRITE setOSD1Format)
  136.     Q_PROPERTY(OSDPosition osd1Position READ getOSD1Position WRITE setOSD1Position)
  137.     Q_PROPERTY(bool osd2Visible READ getOSD2Visible WRITE setOSD2Visible)
  138.     Q_PROPERTY(int osd2FontSize READ getOSD2FontSize WRITE setOSD2FontSize)
  139.     Q_PROPERTY(QString osd2Text READ getOSD2Text WRITE setOSD2Text)
  140.     Q_PROPERTY(QColor osd2Color READ getOSD2Color WRITE setOSD2Color)
  141.     Q_PROPERTY(QImage osd2Image READ getOSD2Image WRITE setOSD2Image)
  142.     Q_PROPERTY(OSDFormat osd2Format READ getOSD2Format WRITE setOSD2Format)
  143.     Q_PROPERTY(OSDPosition osd2Position READ getOSD2Position WRITE setOSD2Position)
  144. public:
  145.     //标签格式
  146.     enum OSDFormat {
  147.         OSDFormat_Text = 0,             //文本
  148.         OSDFormat_Date = 1,             //日期
  149.         OSDFormat_Time = 2,             //时间
  150.         OSDFormat_DateTime = 3,         //日期时间
  151.         OSDFormat_Image = 4             //图片
  152.     };
  153.     //标签位置
  154.     enum OSDPosition {
  155.         OSDPosition_Left_Top = 0,       //左上角
  156.         OSDPosition_Left_Bottom = 1,    //左下角
  157.         OSDPosition_Right_Top = 2,      //右上角
  158.         OSDPosition_Right_Bottom = 3    //右下角
  159.     };
  160.     explicit VlcWidget(QWidget *parent = 0);
  161.     ~VlcWidget();
  162. protected:
  163.     void paintEvent(QPaintEvent *);
  164.     void drawBorder(QPainter *painter);
  165.     void drawBg(QPainter *painter);
  166.     void drawImg(QPainter *painter, QImage img);
  167.     void drawOSD(QPainter *painter,
  168.                  int osdFontSize,
  169.                  const QString &osdText,
  170.                  const QColor &osdColor,
  171.                  const QImage &osdImage,
  172.                  const OSDFormat &osdFormat,
  173.                  const OSDPosition &osdPosition);
  174. private:
  175.     VlcObject *vlc;                 //实时视频采集对象
  176.     QTimer *timerCheck;             //定时器检查设备是否在线
  177.     QImage image;                   //要显示的图片
  178.     bool copyImage;                 //是否拷贝图片
  179.     bool checkLive;                 //检测是否活着
  180.     bool drawImage;                 //是否绘制图片
  181.     bool fillImage;                 //自动拉伸填充
  182.     int timeout;                    //超时时间
  183.     int borderWidth;                //边框宽度
  184.     QColor borderColor;             //边框颜色
  185.     QColor focusColor;              //有焦点边框颜色
  186.     QString bgText;                 //默认无图像显示文字
  187.     QImage bgImage;                 //默认无图像背景图片
  188.     bool osd1Visible;               //显示标签1
  189.     int osd1FontSize;               //标签1字号
  190.     QString osd1Text;               //标签1文本
  191.     QColor osd1Color;               //标签1颜色
  192.     QImage osd1Image;               //标签1图片
  193.     OSDFormat osd1Format;           //标签1文本格式
  194.     OSDPosition osd1Position;       //标签1位置
  195.     bool osd2Visible;               //显示标签2
  196.     int osd2FontSize;               //标签2字号
  197.     QString osd2Text;               //标签2文本
  198.     QColor osd2Color;               //标签2颜色
  199.     QImage osd2Image;               //标签2图片
  200.     OSDFormat osd2Format;           //标签2文本格式
  201.     OSDPosition osd2Position;       //标签2位置
  202. public:
  203.     QImage getImage()               const;
  204.     bool getIsPlaying()             const;
  205.     bool getCopyImage()             const;
  206.     bool getCheckLive()             const;
  207.     bool getDrawImage()             const;
  208.     bool getFillImage()             const;
  209.     int getTimeout()                const;
  210.     int getBorderWidth()            const;
  211.     QColor getBorderColor()         const;
  212.     QColor getFocusColor()          const;
  213.     QString getBgText()             const;
  214.     QImage getBgImage()             const;
  215.     bool getOSD1Visible()           const;
  216.     int getOSD1FontSize()           const;
  217.     QString getOSD1Text()           const;
  218.     QColor getOSD1Color()           const;
  219.     QImage getOSD1Image()           const;
  220.     OSDFormat getOSD1Format()       const;
  221.     OSDPosition getOSD1Position()   const;
  222.     bool getOSD2Visible()           const;
  223.     int getOSD2FontSize()           const;
  224.     QString getOSD2Text()           const;
  225.     QColor getOSD2Color()           const;
  226.     QImage getOSD2Image()           const;
  227.     OSDFormat getOSD2Format()       const;
  228.     OSDPosition getOSD2Position()   const;
  229. private slots:
  230.     //接收图像并绘制
  231.     void updateImage(const QImage &image);
  232.     //校验设备
  233.     void checkVideo();
  234. signals:
  235.     //播放成功
  236.     void receivePlayOk();
  237.     //播放失败
  238.     void receivePlayError();
  239.     //播放结束
  240.     void receivePlayFinsh();
  241.     //收到图片信号
  242.     void receiveImage(const QImage &image);
  243. public slots:    
  244.     //设置视频宽度
  245.     void setVideoWidth(int videoWidth);
  246.     //设置视频高度
  247.     void setVideoHeight(int videoHeight);
  248.     //设置检测连接超时
  249.     void setCheckTime(int checkTime);
  250.     //设置是否检测连接
  251.     void setCheckConn(bool checkConn);
  252.     //设置是否保存文件
  253.     void setSaveFile(bool saveFile);
  254.     //设置保存文件名称
  255.     void setFileName(const QString &fileName);
  256.     //设置视频流地址
  257.     void setUrl(const QString &url);
  258.     //设置是否拷贝图片
  259.     void setCopyImage(bool copyImage);
  260.     //设置是否检测活着
  261.     void setCheckLive(bool checkLive);
  262.     //设置是否实时绘制图片
  263.     void setDrawImage(bool drawImage);
  264.     //设置是否拉伸填充
  265.     void setFillImage(bool fillImage);
  266.     //设置超时时间
  267.     void setTimeout(int timeout);
  268.     //设置边框宽度
  269.     void setBorderWidth(int borderWidth);
  270.     //设置边框颜色
  271.     void setBorderColor(const QColor &borderColor);
  272.     //设置有焦点边框颜色
  273.     void setFocusColor(const QColor &focusColor);
  274.     //设置无图像文字
  275.     void setBgText(const QString &bgText);
  276.     //设置无图像背景图
  277.     void setBgImage(const QImage &bgImage);
  278.     //设置标签1是否可见
  279.     void setOSD1Visible(bool osdVisible);
  280.     //设置标签1文字字号
  281.     void setOSD1FontSize(int osdFontSize);
  282.     //设置标签1文本
  283.     void setOSD1Text(const QString &osdText);
  284.     //设置标签1文字颜色
  285.     void setOSD1Color(const QColor &osdColor);
  286.     //设置标签1图片
  287.     void setOSD1Image(const QImage &osdImage);
  288.     //设置标签1格式
  289.     void setOSD1Format(const OSDFormat &osdFormat);
  290.     //设置标签1位置
  291.     void setOSD1Position(const OSDPosition &osdPosition);
  292.     //设置标签2是否可见
  293.     void setOSD2Visible(bool osdVisible);
  294.     //设置标签2文字字号
  295.     void setOSD2FontSize(int osdFontSize);
  296.     //设置标签2文本
  297.     void setOSD2Text(const QString &osdText);
  298.     //设置标签2文字颜色
  299.     void setOSD2Color(const QColor &osdColor);
  300.     //设置标签2图片
  301.     void setOSD2Image(const QImage &osdImage);
  302.     //设置标签2格式
  303.     void setOSD2Format(const OSDFormat &osdFormat);
  304.     //设置标签2位置
  305.     void setOSD2Position(const OSDPosition &osdPosition);
  306.     //打开设备
  307.     void open();
  308.     //暂停
  309.     void pause();
  310.     //继续
  311.     void next();
  312.     //关闭设备
  313.     void close();
  314.     //重新加载
  315.     void restart();
  316.     //清空
  317.     void clear();
  318.     //快照
  319.     void snap(const QString &fileName, int width = 640, int height = 480);
  320. };
  321. #endif // VLC_H

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

只看该作者 1楼 发表于: 2018-05-03
路过
离线ccazqyy

只看该作者 2楼 发表于: 2018-05-04
    
离线liuchangyin

只看该作者 3楼 发表于: 2018-05-04
离线liruigood

只看该作者 4楼 发表于: 2018-05-05
很好,很强大!向您反馈一下,刚才运行了一下exe,我自己接了一个网络摄像头,可以打开,时间久了发现视频有至少5s的延迟,不知道是怎么回事。
离线liudianwu

只看该作者 5楼 发表于: 2018-05-05
回 liruigood 的帖子
liruigood:很好,很强大!向您反馈一下,刚才运行了一下exe,我自己接了一个网络摄像头,可以打开,时间久了发现视频有至少5s的延迟,不知道是怎么回事。 (2018-05-05 11:02) 

你可以百度搜索下vlc延迟!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个