视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——通过流媒体服务开启语音对讲

本文主要是介绍视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——通过流媒体服务开启语音对讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TSINGSEE青犀视频团队研发的视频平台大多已经支持了语音对讲的功能,EasyCVR视频上云服务也能够在海康EHome协议下调用语音对讲(语音对讲操作流程),本文是语音对讲功能的一个拓展,将跟大家讲解一下EasyCVR集成海康EHome协议通过流媒体服务通道实现的语音对讲功能的流程。

通过流媒体服务开启语音对讲的接口调用图

1421.png

可以看到通过流媒体服务开启语音对讲比直接打开语音对讲功能的流程要复杂。以下是调用步骤:

1、调用NET_ECMS_XMLConfig和命令GetDevAbility获取设备能力并判断设备是否支持通过流媒体服务开启语音对讲。

设备能力由pOutBuf返回:
如果支持,将返回节点,可继续下面步骤。
否则,请结束该任务。

2、调用NET_ESTREAM_StartListenPreview开启SMS监听服务并接收来自设备的连接请求。

3、调用NET_ESTREAM_SetExceptionCallBack为SMS注册异常回调函数。

4、调用NET_ECMS_StartVoiceWithStmServer将语音对讲开启请求从CMS发送给设备。

发送SMS的地址和端口号给设备,设备自动为CMS分配一个会话ID。

5、调用NET_ECMS_StartPushVoiceStream将语音传输请求从CMS发送给设备。设备自动连接SMS并开始发送音频数据给SMS。

6、执行下面某个操作接收来自设备的音频数据或发送音频数据至设备。

调用NET_ESTREAM_SetVoiceTalkDataCB为SMS注册回调函数用于接收来自设备的音频数据。

从SMS注册的语音回调函数中获取音频数据并将其转发给客户端软件。

语音对讲音频码流的解码和显示由客户端软件实现。
调用NET_ESTREAM_SendVoiceTalkData将音频数据发送给设备。

7、调用NET_ESTREAM_StopVoiceTalk停止SMS的音频码流转发。

8、调用NET_ECMS_StopVoiceTalkWithStmServer将语音对讲停止请求从CMS发送给设备。设备停止传输音频码流。

9、调用NET_ESTREAM_StopListenVoiceTalk停止SMS监听服务并断开其与设备的连接。

   void main(){//SMS开启服务//SMS初始化NET_ESTREAM_Init();//语音对讲监听参数NET_EHOME_LISTEN_VOICETALK_CFG struListen = {0};memcpy(struListen.struIPAdress.szIP,"10.16.2.123", sizeof("10.16.2.123"));struListen.struIPAdress.wPort = 8003; //流媒体服务监听端口struListen.fnNewLinkCB = fnVOICETALK_NEWLINK_CB; //语音对讲连接请求回调函数struListen.pUser = NULL;//启动语音对讲监听LONG lHandle = NET_ESTREAM_StartListenVoiceTalk(&struListen);if(lHandle < -1){printf("NET_ESTREAM_StartListenVoiceTalk failed, error code: %d\n", NET_ESTREAM_GetLastError());NET_ESTREAM_Fini();return;}printf("NET_ESTREAM_StartListenVoiceTalk!\n");////CMS注册和语音对讲请求//CMS注册模块初始化NET_ECMS_Init();//注册监听参数NET_EHOME_CMS_LISTEN_PARAM struCMSListenPara = {0};memcpy(struCMSListenPara.struAddress.szIP, "0.0.0.0", sizeof("0.0.0.0"));struCMSListenPara.struAddress.wPort = 7660;struCMSListenPara.fnCB = RegisterCallBack;//启动监听服务,接收设备注册信息LONG lListen = NET_ECMS_StartListen(&struCMSListenPara);if(lListen < -1){printf("NET_ECMS_StartListen failed, error code: %d\n", NET_ECMS_GetLastError());NET_ECMS_Fini();return;}printf("NET_ECMS_StartListen!\n");while(1){Sleep(1000);  //注册成功之后再做后续操作if(lLoginID >= 0){break;}}//语音对讲请求输入参数NET_EHOME_VOICE_TALK_IN struVoiceTalkIn = {0};struVoiceTalkIn.dwVoiceChan = 1; //语音对讲通道号memcpy(struVoiceTalkIn.struStreamSever.szIP, "10.16.2.123", sizeof("10.16.2.123"));//流媒体服务IP地址struVoiceTalkIn.struStreamSever.wPort = 8003; //流媒体服务端口,需要跟服务监听端口一致//语音对讲请求输出参数NET_EHOME_VOICE_TALK_OUT struVoiceTalkOut = {0};//CMS语音对讲请求if(!NET_ECMS_StartVoiceWithStmServer(lLoginID, &struVoiceTalkIn, &struVoiceTalkOut)){printf("NET_ECMS_StartVoiceWithStmServer failed, error code: %d\n", NET_ECMS_GetLastError());NET_ECMS_Fini();return;}printf("NET_ECMS_StartVoiceWithStmServer!\n");//CMS请求开始推流NET_EHOME_PUSHVOICE_IN struPushVoiceIn = {0};struPushVoiceIn.dwSize = sizeof(struPushVoiceIn);struPushVoiceIn.lSessionID = struVoiceTalkOut.lSessionID;NET_EHOME_PUSHVOICE_OUT struPushVoiceOut = {0};struPushVoiceOut.dwSize = sizeof(struPushVoiceOut);if (!NET_ECMS_StartPushVoiceStream(lLoginID, &struPushVoiceIn, &struPushVoiceOut)){printf("NET_ECMS_StartPushVoiceStream failed, error code: %d\n", NET_ECMS_GetLastError());NET_ECMS_Fini();return;}printf("NET_ECMS_StartPushVoiceStream!\n");//创建线程从文件读取语音数据发送给设备DWORD dwThreadId;CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(TestVoiceTransThread), (void*)lVoiceLinkHandle, 0, &dwThreadId);Sleep(50000);//退出//释放CMS语音对讲请求资源if(!NET_ECMS_StopVoiceTalkWithStmServer(lLoginID, struVoiceTalkOut.lSessionID)){printf("NET_ECMS_StopVoiceTalkWithStmServer failed, error code: %d\n", NET_ECMS_GetLastError());}//CMS停止监听服务if(!NET_ECMS_StopListen(lListen)){printf("NET_ECMS_StopListen failed, error code: %d\n", NET_ECMS_GetLastError());}//CMS反初始化,释放资源NET_ECMS_Fini();////SMS停止语音对讲if(lVoiceHandle >= 0){if (!NET_ESTREAM_StopVoiceTalk(lVoiceHandle)){printf("NET_ESTREAM_StopVoiceTalk failed, error code: %d\n", NET_ECMS_GetLastError());}}//SMS停止语音对讲监听服务if(lVoiceLinkHandle >= 0){if (!NET_ESTREAM_StopListenVoiceTalk(lVoiceLinkHandle)){printf("NET_ESTREAM_StopListenVoiceTalk failed, error code: %d\n", NET_ECMS_GetLastError());}}//SMS反初始化,释放资源NET_ESTREAM_Fini();//释放文件资源if(AudioTalkfile != NULL){fclose(AudioTalkfile);AudioTalkfile = NULL;}printf("Exit!\n");
}

EasyCVR视频平台播放界面:

2.png

视频联网云平台EasyCVR是一个集视频联网共享、存储、流媒体转发、视频转码、视频上云、智能分析统一等多种功能为一体的流媒体视频服务融合性平台。视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可自行进行下载及测试。

这篇关于视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——通过流媒体服务开启语音对讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930813

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶