视频监控系统视频上云解决方案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

相关文章

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

SpringBoot集成WebService(wsdl)实践

《SpringBoot集成WebService(wsdl)实践》文章介绍了SpringBoot项目中通过缓存IWebService接口实现类的泛型入参类型,减少反射调用提升性能的实现方案,包含依赖配置... 目录pom.XML创建入口ApplicationContextUtils.JavaJacksonUt

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

《Java单元测试之Mockito模拟静态方法与私有方法最佳实践》本文将深入探讨如何使用Mockito来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立... 目录Mockito 简介:为什么选择它?环境准备模拟静态方法:打破“不可变”的枷锁传统困境解法一:使用M

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s