• Qt音视频开发20-海康sdk本地播放


    一、前言

    海康sdk中包含了MP4解码播放库,对应的API函数都是PlayM4开头的,顾名思义播放MP4,海康的视频默认可以保存成MP4文件,可以用通用的播放器来播放,这就是为啥前面好多篇文章讲到的各种内核录像存储都改成MP4来存储,vlc、mpv、ffmpeg等,最终录像存储都转换成MP4文件,看来大公司大厂做的也是保存成MP4文件,肯定是有他的道理,至于有多少道理,跟着他学者他这样处理就行,可以先不用问不用管,直接上手撸代码就对了,有些东西需要深究原理,而有些东西就没有必要太过于细致询问下去了,折腾下去陷入死胡同,好比知道1+1=2就行,至于为啥=2,交给专门的研究人员去研究就行。

    海康sdk的MP4解码库,即支持自身的MP4文件,也支持常规的MP4文件,而且最新版本还支持AVI文件格式,随便试了本地的MP4文件,也都是支持的,如果需要拿到音视频数据,只需要调用PlayM4_SetDecCallBackMend设置下解码回调函数即可,比视频流的回调流程简单很多,少了设置回调处理函数一大堆处理,只需要解码转换成QImage即可。本地文件还需要增加一个文件结束回调,这样能知道什么时候文件播放完成了,发出对应的信号进行处理,可以调用PlayM4_SetFileEndCallback设置文件播放完毕回调函数,在FileEndCallback回调函数中,通过异步执行QMetaObject::invokeMethod停止函数来通知界面。

    关于本地文件请注意以下几点:

    1. 文件方式播放下,不能调用PlayM4_CloseStream。
    2. 流播放下,不能调用PlayM4_CloseFile接口。
    3. 流开关接口和文件开关接口不能交叉使用。

    二、功能特点

    1. 支持播放视频流和本地MP4文件。
    2. 支持句柄和回调两种模式。
    3. 多线程显示图像,不卡主界面。
    4. 自动重连网络摄像头。
    5. 可设置边框大小即偏移量和边框颜色。
    6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。
    7. 可设置两种OSD位置和风格。
    8. 可设置是否保存到文件以及文件名。
    9. 可直接拖曳文件到haikangwidget控件播放。
    10. 支持h264/h265视频流。
    11. 可暂停播放和继续播放。
    12. 支持存储单个视频文件和定时存储视频文件。
    13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
    14. 可设置画面拉伸填充或者等比例填充。
    15. 可设置解码是速度优先、质量优先、均衡处理。
    16. 可对视频进行截图(原始图片)和截屏(视频窗体)。
    17. 录像文件存储为MP4文件。
    18. 支持焦距控制、云台控制。
    19. 可定制功能。

    三、效果图

    四、相关站点

    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

    五、核心代码

    bool HaiKangThread::playLocal()
    {
        //转码以便支持中文路径
        QTextCodec *codec = QTextCodec::codecForName("gb2312");
        QByteArray data = codec->fromUnicode(url);
    
        PlayM4_GetPort(&port);
        bool ok = PlayM4_OpenFile(port, data.data());
        if (ok) {
            //设置文件播放完毕回调函数
            PlayM4_SetFileEndCallback(port, FileEndCallback, this);
    
            //回调则可以拿到音视频数据,否则就直接句柄播放
            if (callback) {
                PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
                PlayM4_Play(port, NULL);
            } else {
                PlayM4_Play(port, (HWND)playWidget->winId());
            }
    
            //同时播放声音
            PlayM4_PlaySound(port);
    
            //倒放
            //PlayM4_ReversePlay(port);
    
            //快进播放,多次调用速度更快
            //PlayM4_Fast(port);
            //PlayM4_Fast(port);
    
            ok = true;
            qDebug() << TIMEMS << "打开视频文件成功" << url;
        } else {
            qDebug() << TIMEMS << "打开视频文件失败" << url << PlayM4_GetLastError(port);
        }
    
        return ok;
    }
    
    void HaiKangThread::free()
    {
        if (isRtsp) {
            //停止播放+登出设备
            NET_DVR_StopRealPlay(hand);
            NET_DVR_Logout(hand);
            hand = -1;
        } else {
            //停止播放+关闭文件+释放端口
            PlayM4_Stop(port);
            PlayM4_StopSound();
            PlayM4_CloseFile(port);
            PlayM4_FreePort(port);
            port = -1;
        }
    }
    
  • 相关阅读:
    甲骨文新BI应用紧盯SAP客户
    HR相关知识
    透过李宁集团看零售行业BI解决案例
    三全食品:信息化建设狂飙突进的六年
    国际主流商业BI产品对比分析
    项目管理的9个知识领域5个项目管理过程组及项目管理的三维约束
    给管理新手的六点建议(转)
    Oracle BI产品线
    怎么上传应用
    android 各种进度条(ProgressBar)
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/13576124.html
Copyright © 2020-2023  润新知