Qt编写安防视频监控系统15-远程回放

一、前言

远程回放有两种处理方式,一种是采用NVR厂家提供的SDK开发包来登录到NVR上,然后根据SDK的函数接口指定的视频文件,当然也有接口查询视频文件列表等;一种是采用视频监控行业的国标GB28181协议,来注册到NVR上然后查询和播放视频文件。两种处理方式各有优缺点,用SDK的话,接口比较丰富,有很多特殊的处理都在SDK的函数中可以看到,相对来说速度和清晰度会更快一点,操作的友好性高,毕竟是自家的SDK,肯定对自家的设备支持非常好,缺点就是每个厂家都有一个SDK开发包,如果第三方集成厂家需要兼容多个厂家的话,就需要针对每个厂家的SDK都要来一遍,这个对于开发人员来说,厂家越多越崩溃,而国标GB28181的出现就是为了规范这些厂家,类似于onvif一样,约定厂家都按照一个统一的标准来回放视频,这对于广大开发者来说是福音,一般视频监控设备厂家除了支持自家的SDK以外,肯定都会支持onvif和gb28181,不过检测的产品除外。正常来说过检测的产品价格会贵一些,毕竟检测成本摆在那。

皮肤开源:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo
文件名称:styledemo

体验地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe
文件名称:bin_video_system.zip

二、功能特点

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

三、效果图


四、核心代码

void Demo::on_pushButtonLogin_clicked()
{
    UNS_INT32 ret;
    mDeviceType = ui->comboBoxProtocol->currentData().toInt();
    mDeviceIP = ui->lineEditAddress->text();
    mDevicePort = ui->lineEditPort->text().toInt();
    mUsername = ui->lineEditUsername->text();
    mPassword = ui->lineEditPassword->text();

    QByteArray username = mUsername.toLatin1();
    QByteArray password = mPassword.toLatin1();
    QByteArray ipaddr = mDeviceIP.toLatin1();

    QString result;
    ret = DeviceInterface::login(mDeviceType, username.data(), password.data(), ipaddr.data(), mDevicePort, mLoginHandle);
    if (ret != UNS_ESUCCESS) {
        result = QString::fromLocal8Bit("登录失败,错误码 ") + QString::number(ret, 10);
    QMessageBox::question(this, QString::fromLocal8Bit("提示框"), result, QMessageBox::Yes);
    } else {
        result = QString::fromLocal8Bit("登录成功");
        updateChannelList();
    }

}

void Demo::on_pushButtonLogout_clicked()
{
    if (!checkLogin()) {
        return;
    }
    DeviceInterface::logout(mLoginHandle);
    mLoginHandle = NULL;
}

void Demo::onStartPlayLive()
{
    UNS_INT32 ret;
    if (!checkLogin()) {
        return;
    }

    updatePlayLiveData(NULL);

    UNS_LIVEPLAY_PARAMETER_T param;
    param.channel = 0;//mPlayLiveChannel;
    param.stream_type = mStreamType;
    param.play_wnd = (void *)(ui->videoFrame->winId());
    mPlayType = 0;
    ret = DeviceInterface::startLivePlay(mLoginHandle, &param, liveDataCallback, this, mPlayHandle);
    if (ret != UNS_ESUCCESS) {

        QString result = QString::fromLocal8Bit("预览失败,错误码 ") + QString::number(ret, 10);
        QMessageBox::question(this, QString::fromLocal8Bit("提示框"), result, QMessageBox::Yes);
    }
}

void Demo::onStopPlayLive()
{
    if (!checkLogin()) {
        return;
    }

    if (mPlayType != 0) {
        return;
    }

    UNS_INT32 ret;
    ret = DeviceInterface::stopLivePlay(mPlayHandle);
    ui->videoFrame->update();
}

void Demo::onStartPlayback()
{
    UNS_INT32 ret;
    if (!checkLogin()) {
        return;
    }

    updatePlaybackData();

    UNS_PLAYBACK_PARAMETER_T param;

    param.channel = mPlaybackChannel;
    param.type = 0;
    param.method = 0;
    param.start = mStartTime;
    param.end = mEndTime;
    param.play_wnd = (void *)(ui->videoFrame->winId());
    mPlayType = 1;
    ret = DeviceInterface::startPlayBack(mLoginHandle, &param, backDataCallback, this, mPlayHandle);
    if (ret != UNS_ESUCCESS) {
        QString result = QString::fromLocal8Bit("回放失败,错误码 ") + QString::number(ret, 10);
        QMessageBox::question(this, QString::fromLocal8Bit("提示框"), result, QMessageBox::Yes);
    }
}

void Demo::onStopPlayback()
{
    if (!checkLogin()) {
        return;
    }

    if (mPlayType != 1) {
        return;
    }

    UNS_INT32 ret;
    ret = DeviceInterface::stopPlayBack(mPlayHandle);
    ui->videoFrame->update();
}

void Demo::onFastPlayback()
{
    if (!checkPlayer()) {
        return;
    }

    mPlayScale++;

    UNS_INT32 ret = DeviceInterface::scalePlayBack(mPlayHandle, mPlayScale);
    //CHECK_RESULT(ret);
}

void Demo::onSlowPlayback()
{
    if (!checkPlayer()) {
        return;
    }

    mPlayScale--;

    UNS_INT32 ret = DeviceInterface::scalePlayBack(mPlayHandle, mPlayScale);
    //CHECK_RESULT(ret);
}

void Demo::onPausePlayback()
{
    if (!checkPlayer()) {
        return;
    }

    UNS_INT32 ret = DeviceInterface::pausePlayBack(mPlayHandle);
    // CHECK_RESULT(ret);
}

void Demo::onResumePlayback()
{
    if (!checkPlayer()) {
        return;
    }

    UNS_INT32 ret = DeviceInterface::resumePlayBack(mPlayHandle);
    // CHECK_RESULT(ret);
}

原文地址:https://www.cnblogs.com/feiyangqingyun/p/12058024.html

时间: 2024-11-11 15:37:53

Qt编写安防视频监控系统15-远程回放的相关文章

Qt编写安防视频监控系统11-动态换肤

一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据说有些人写了几千行的样式表,加载起来能够明显感觉卡顿,毕竟此时全部刷新加载重绘,是非常耗CPU的,这种情况就需要避免尽量统一样式表,能合并的就合并,当然,在性能比较好的电脑上,这个基本上遇不到的,也感觉不到的,好比现在的手机相比于十年前的手机,现在动不动都6GB内存了,比起以前256MB内存的时候,不知道

Qt编写安防视频监控系统18-云台控制

一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂家使用自家SDK控制云台,但是大部分都会选择onvif来控制,毕竟是国际标准的通用的,只要符合这个标准的都可以使用,onvif协议的解析通常用的开源库是soap,涵盖的内容比较全,包括获取各种设备信息和回控等,缺点就是比较臃肿,使用非常不容易,函数名实在是有点不顺手,很多新手都绕在其中不知所措最后放

Qt编写安防视频监控系统2-视频播放

一.前言 视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种接口来实现统一的管理,比如vlc内核+ffmpeg内核+海康sdk内核等,随意切换,在使用各种内核的过程中,对比下来,发现easyplayer的内核是最好的,在国内用ffmpeg做接口做到了极致,CPU占用极低. 我个人封装的vlc内核和ffmpeg内核播放控件,均提供统一的接口设置两种OSD,包括OSD位置和风格样式,可设置保

(转)基于单片机的网络视频监控系统的设计

本文提出了一种网络化视频监控系统,将单片机控制技术.USB数据采集技术与基于TCP/IP协议栈的计算机网络结构有机结合起来,使人们能够通过监控现场的摄像机和麦克风等视频音频捕捉设备. 将监控现场的信号通过局域网传输,并送到监视器上以获得实时图像和声音,从而实现远程遥视现场. 随着嵌入式系统的飞速发展,在许多领域,以微控制器为中心的应用系统正逐步取代以计算机为中心的应用.因此,对于网络应用系统的研究,越来越多的研究人员将研究重点转移到嵌入式系统上来.基于此背景,本文提出了一种网络化视频监控系统方案

项目三. 基于图像压缩的视频监控系统

项目三. 基于图像压缩的视频监控系统 Sprint0-产品设计与规划 基于图像压缩的视频监控系统 1. 产品功能演示 在linux系统上运行程序,弹出登录界面,输入地址.端口信息,弹出视频监控界面,实时传出视频信息. 2. 功能模块分析 采集端: 图像采集子系统 图像编码子系统 传输子系统 主程序 监控端: 传输子系统 图像编码子系统 传输子系统 主程序 Sprint1-基于Epoll架构的采集端程序框架设计 第1课-Epoll机制精通 大纲: v  为什么用Epoll? 阻塞型IO与多路复用

高清网络视频监控系统中交换机的选择

目前视频监控系统已经完成从传统模拟视频监控到数字视频监控的全面升级,并逐渐发展到高清网络数字视频监控阶段,利用现有的办公网络.行业专网.光纤专网,甚至互联网和无线网络等基础架构,搭建以区域安防.生产监视等不同目的的高清网络视频监控系统.其中百万级像素网络摄像机的大规模普及,既解决了传统模拟视频监控系统清晰度不足的尴尬局面也提高了监控系统的便捷性和安全性. 高清网络视频监控系统优势 先进性:利用现有的综合布线网络传输图像,进行实时监控系统所需的前端设备少,连线简洁,后端仅需一套软件系统即可; 可靠

大规模视频监控系统将以云存储为主

随着高清技术的普及,720P.1080P视频已经遍地开花,同时基于对 清晰度的追求,时候智能分析的处理,500W.800W.甚至上千万更高分辨率的摄像机开始崭露头角:如此高清的监控,问题也伴随而来:高清视频数据动辄 几G到几十G的文件,对存储设备的容量.读写性能.可靠性.扩展性等都提出了更高的要求,对于存储厂商而言也面临着更大的挑战:如何在视频监控系统中选用 适宜的数据存储解决方案,显得格外重要.站在系统建设角度考虑,需要充分考虑功能集成度.数据安全性.数据稳定性,系统可扩展性.性能及成本各方面

视频监控系统显示大屏幕用液晶拼接屏还是液晶监视器?

视频监控系统与我们的日常生活息息相关,在一些大型的企业.社区物业.商场.银行等场合都会安装视频监控录像设备,以确保我们的人身.财产安全,及时发现不法分子的活动,能做到提前发现与作为后期的证据使用.视频监控系统最重要的设备应该属于在监控室内的液晶显示大屏幕,目前专业用语视频监控系统显示大屏幕的设备有两种:一种是液晶拼接屏,另一种是液晶监视器.1.液晶拼接屏液晶拼接屏是一款专业的用于视频监控系统画面显示的大屏幕产品,相比液晶监视器来说,它通过拼接可以实现想要多大就有多大的显示屏幕.目前拼接屏单屏尺寸

一套硬核安防视频云平台的炼成

导读 三大特点.五大重点,一套硬核安防视频云平台是这样炼成的 很多人会困惑,云计算究竟是什么? 它是可以被看作为商品的一种计算能力,可以在线上被无限制流通,就如水.电.煤气一样,可以被人们方便地取用,且价格相较低廉. 十多年前,无论是中国.美国,亚洲.欧洲,无论是大企业还是小公司,建设企业 IT 架构,为公司的业务和战略做信息支撑的思路都如出一辙——购买服务器,只是多或少的问题. 今天来看,这类 IT 基础设施的布局是一项非常不必要的高额支出,因为他们可以通过租用“公有云”的云计算服务来获取性价