• 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);
    }
    
  • 相关阅读:
    list count++
    Java程序员常用工具类库
    Java读写Excel之POI超入门
    JS操作JSON总结
    ORACLE RAC 11G 添加以及删除UNDO表空间
    oracle 索引优化之distinct
    Redis常用的命令
    Linux 安装Redis 5.0(以及参数调优)
    OEM12C(12.1.0.5)安装插件监控mysql(linux)
    mysql版本升级
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/12058024.html
Copyright © 2020-2023  润新知