TSINGSEE青犀视频团队研发的视频平台大多已经支持了语音对讲的功能,EasyCVR视频上云服务也能够在海康EHome协议下调用语音对讲(语音对讲操作流程),本文是语音对讲功能的一个拓展,将跟大家讲解一下EasyCVR集成海康EHome协议通过流媒体服务通道实现的语音对讲功能的流程。
可以看到通过流媒体服务开启语音对讲比直接打开语音对讲功能的流程要复杂。以下是调用步骤:
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是一个集视频联网共享、存储、流媒体转发、视频转码、视频上云、智能分析统一等多种功能为一体的流媒体视频服务融合性平台。视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可自行进行下载及测试。