Qt音视频开发47-通用视频控件

2020-11-19 14:29:58 浏览数 (1)

一、前言

自从视频监控系统的内核不断增加,从最初的vlc到ffmpeg然后到mpv,后面还陆续增加了海康sdk等,每次增加一个内核,整个视频监控系统就有三五个代码文件需要修改,而且大部分是重复的代码,通过define来区分不同的内核,所以重新整理了一个视频类,里面就define处理好了,提供了个公共接口,在需要的地方直接实例化一个类就行,而不需要在不同的地方实例化不同的类,大大减轻了后期的工作量,也复用了很多代码。

通用视频控件基本功能:

  1. 调用setUrl函数设置要播放的视频文件或者流地址。
  2. 调用open方法打开视频、close方法关闭视频。
  3. 调用pause方法暂停播放、next方法继续播放。
  4. 调用getVolume函数获取音量、setVolume函数设置音量。
  5. 调用getMute函数获取静音状态、setMute函数设置静音。
  6. 调用getLength函数获取文件长度。
  7. 调用getPosition函数获取当前播放位置、setPosition设置播放位置。
  8. 播放成功发出receivePlayStart信号。
  9. 播放失败发出receivePlayError信号。
  10. 播放结束发出receivePlayFinsh信号。
  11. 执行截图动作后,触发snapImage信号。
  12. 解析出一张图片后,触发receiveImage信号。
  13. 播放文件发出fileLengthReceive总时长信号。
  14. 音量调节或者静音状态变动后发出fileVolumeReceive信号。
  15. 播放位置变动后发出filePositionReceive信号。
  16. 接收到拖曳文件发出fileDrag信号。
  17. 悬浮条工具栏点击按钮后发出btnClicked信号。
  18. 设置是否保存文件、保存间隔、保存文件夹。
  19. 设置是否拉伸填充图片、是否深拷贝图片。
  20. 设置是否断线重连、超时时间。
  21. 设置悬浮条可见、背景颜色、按下颜色等。
  22. 设置边框粗细和颜色、背景文字和图片。
  23. 设置两路OSD的字号、文本、颜色、位置、格式等。
  24. 设置是否采用回调、硬解码名称、流通信协议等。

二、功能特点

  1. 支持多画面切换,全屏切换等,包括1 4 6 8 9 13 16 25 36 64画面切换。
  2. 支持alt enter全屏,esc退出全屏。
  3. 自定义信息框 错误框 询问框 右下角提示框(包含多种格式)。
  4. 17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
  5. 云台仪表盘鼠标移上去高亮,八个方位精准识别。
  6. 底部画面工具栏(画面分割切换 截图声音等设置)移上去高亮。
  7. 可在配置文件更改左上角logo 中文软件名称 英文软件名称。
  8. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
  9. 支持图片地图,设备按钮可以在图片地图上自由拖动自动保存位置信息。
  10. 在百度地图和图片地图上,双击视频可以预览摄像头实时视频。
  11. 堆栈窗体,每个窗体都是个单独的qwidget,方便编写自己的代码。
  12. 顶部鼠标右键菜单,可动态控制时间CPU 左上角面板 左下角面板 右上角面板 右下角面板的显示和隐藏,支持恢复默认布局。
  13. 工具栏可以放置多个小图标和关闭图标。
  14. 左侧右侧可拖动拉伸,并自动记忆宽高位置,重启后恢复。
  15. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。
  16. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
  17. 视频画面窗体支持拖曳交换,瞬间响应。
  18. 双击节点 拖曳节点 拖曳窗体交换位置,均自动更新url.txt。
  19. 支持从url.txt中加载通道视频播放,自动记忆最后通道对应的视频,软件启动后自动打开播放。
  20. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
  21. 集成百度在线地图和离线地图,可以添加设备对应位置,自动生成地图,支持缩放和添加覆盖物等。
  22. 视频拖动到通道窗体外自动删除视频。
  23. 鼠标右键可删除当前 所有视频,截图当前 所有视频。
  24. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
  25. 在pro文件中可以自由开启是否加载地图。
  26. 视频播放可选2种内核自由切换,vlc ffmpeg,均可在pro中设置。
  27. 可设置1 4 9 16画面轮询,可设置轮询间隔以及轮询码流类型等,直接在主界面底部工具栏右侧单击启动轮询按钮即可,再次单击停止轮询。
  28. 默认超过10秒钟未操作自动隐藏鼠标指针。
  29. 支持onvif搜素设备,支持任意onvif摄像机,包括但不限于海康大华宇视天地伟业华为等。
  30. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
  31. 同时支持sqlite、mysql、postsql等数据库。
  32. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
  33. 可设置视频流通信方式tcp udp,可设置视频解码是速度优先、质量优先、均衡等。
  34. 可设置硬解码类型,支持qsv、dxva2、d3d11va等。
  35. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。
  36. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,支持linux和mac系统。

三、效果图

QQ截图20201118181948.jpgQQ截图20201118181948.jpg

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

代码语言:txt复制
#ifndef COMMONVIDEOWIDGET_H
#define COMMONVIDEOWIDGET_H

#ifdef videovlc
#include "vlcwidget.h"
#elif videoffmpeg
#include "ffmpegwidget.h"
#elif videompv
#include "mpvwidget.h"
#elif haikang
#include "haikangwidget.h"
#else
#include "videowidget.h"
#endif

class CommonVideoWidget : public QWidget
{
    Q_OBJECT
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 CommonVideoWidget(QWidget *parent = 0);
    ~CommonVideoWidget();    

private:
#ifdef videovlc
    VlcWidget *widget;
#elif videoffmpeg
    FFmpegWidget *widget;
#elif videompv
    MpvWidget *widget;
#elif haikang
    HaiKangWidget *widget;
#else
    VideoWidget *widget;
#endif

public:
    QImage getImage()               const;
    QPixmap getPixmap()             const;
    QString getUrl()                const;
    QDateTime getLastTime()         const;

    bool getCallback()              const;
    bool getIsPlaying()             const;
    bool getIsRtsp()                const;
    bool getIsUsbCamera()           const;

    bool getCopyImage()             const;
    bool getCheckLive()             const;
    bool getDrawImage()             const;
    bool getFillImage()             const;

    bool getFlowEnable()            const;
    QColor getFlowBgColor()         const;
    QColor getFlowPressColor()      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;

    int getFaceBorder()             const;
    QColor getFaceColor()           const;
    QList<QRect> getFaceRects()     const;

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

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

    //总时长
    void fileLengthReceive(qint64 length);
    //当前播放时长
    void filePositionReceive(qint64 position);
    //音量大小
    void fileVolumeReceive(int volume, bool muted);

    //接收到拖曳文件
    void fileDrag(const QString &url);
    //工具栏单击
    void btnClicked(const QString &btnName);

public slots:
    //设置焦点
    void setFocus2();

    //设置视频宽度
    void setVideoWidth(int videoWidth);
    //设置视频高度
    void setVideoHeight(int videoHeight);

    //设置缓存图片宽度
    void setBufferWidth(int bufferWidth);
    //设置缓存图片高度
    void setBufferHeight(int bufferHeight);

    //获取长度
    qint64 getLength();
    //获取当前播放位置
    qint64 getPosition();
    //设置播放位置
    void setPosition(qint64 position);

    //获取静音状态
    bool getMuted();
    //设置静音
    void setMuted(bool muted);

    //获取音量
    int getVolume();
    //设置音量
    void setVolume(int volume);

    //设置显示间隔
    void setInterval(int interval);
    //设置帧数,用于播放自身存储的视频流文件,控制播放速度
    void setVideoFps(int videoFps);
    //设置休眠时间
    void setSleepTime(int sleepTime);
    //设置检测连接超时
    void setCheckTime(int checkTime);
    //设置是否检测连接
    void setCheckConn(bool checkConn);
    //设置是否播放音频
    void setPlayAudio(bool playAudio);

    //设置视频流地址
    void setUrl(const QString &url);
    //设置是否采用回调
    void setCallback(bool callback);
    //设置硬件解码器名称
    void setHardware(const QString &hardware);
    //设置通信协议
    void setTransport(const QString &transport);
    //设置缓存时间
    void setCaching(int caching);
    //设置图片质量类型
    void setImageFlag(int imageFlag);

#ifdef videoffmpeg
    //设置参数
    void setOption(const char *key, const char *value);
#elif videovlc
    //设置参数
    void setOption(const QString &option);
#elif videompv
    //通用属性接口
    QVariant getValue(const QString &name);
    void setValue(const QString &name, const QVariant &value);
    void setOption(const QString &name, const QVariant &value);
    void command(const QVariant &args);
#endif

    //设置是否保存文件
    void setSaveFile(bool saveFile);
    //设置保存间隔
    void setSaveInterval(int saveInterval);
    //设置保存文件夹
    void setSavePath(const QString &savePath);
    //设置定时保存文件唯一标识符
    void setFileFlag(const QString &fileFlag);
    //设置保存文件名称
    void setFileName(const QString &fileName);
    //设置只存储单个文件的保存时间
    void setSaveTime(const QDateTime &saveTime);

    //设置是否拷贝图片
    void setCopyImage(bool copyImage);
    //设置是否检测活着
    void setCheckLive(bool checkLive);
    //设置是否实时绘制图片
    void setDrawImage(bool drawImage);
    //设置是否拉伸填充
    void setFillImage(bool fillImage);

    //设置是否启用悬浮条
    void setFlowEnable(bool flowEnable);
    //设置悬浮条背景颜色
    void setFlowBgColor(const QColor &flowBgColor);
    //设置悬浮条按下颜色
    void setFlowPressColor(const QColor &flowPressColor);

    //设置超时时间
    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 setFaceBorder(int faceBorder);
    //设置人脸框颜色
    void setFaceColor(const QColor &faceColor);
    //设置人脸框区域集合
    void setFaceRects(const QList<QRect> &faceRects);

    //打开设备
    void open();
    //暂停
    void pause();
    //继续
    void next();
    //关闭设备
    void close();
    //重新加载
    void restart(int delayOpen = 20);
    //清空
    void clear();
    //快照
    void snap(const QString &fileName);
};
#endif // COMMONVIDEOWIDGET_H

0 人点赞