最近项目需求,需要把大华摄像头数据接入到自己的web平台,通过前端页面查看监控视频并且实现一语音对讲功能。
摄像头视频接入这里不在赘述,着重分享一下关于语音对讲功能时遇到的一些问题,
首先查看大华官方语音对讲功能流程
1.调用
CLIENT_Init
完成
SDK
初始化流程。
2.初始化成功后,调用
CLIENT_LoginWithHighLevelSecurity
登录设备。
3.调用
CLIENT_SetDeviceMode
设置语音对讲编码信息,参数
emType
设置为
DH_TALK_ENCODE_TYPE
。
4.调用
CLIENT_StartTalkEx
设置回调函数并开始语音对讲。在回调函数中,调用
CLIENT_AudioDec
,解码设备发送过来的音频数据;调用
CLIENT_TalkSendData
,发送
PC
端的音频数据到设备。
5.调用
CLIENT_StopTalkEx
停止语音对讲。
6.调用
CLIENT_Logout
登出设备。
7.SDK
功能使用完后,调用
CLIENT_Cleanup
释放
SDK
资源。
把大华摄像头直连电脑,运行官方demo

通过官方demo调用语音对讲功能成功
然后把对应接口集成到自己项目,和前端兄弟进行本地测试,通过前端网页调用后台语音对讲功能成功。本以为对接过程如此顺利,就把项目部署到linuxlinux服务器上进行测试,结果现实果然没这么顺利。
linux服务器环境下,调用语音对讲功能时报错:

根据日志信息查看大华sdk源码:
/**
* \if ENGLISH_LANG
* Start Talk
* \else
* 开始通话
* \endif
*/
public static boolean startTalk(int transferType, int chn) {
// 设置语音对讲编码格式
NetSDKLib.NETDEV_TALKDECODE_INFO talkEncode = new NetSDKLib.NETDEV_TALKDECODE_INFO();
talkEncode.encodeType = NetSDKLib.NET_TALK_CODING_TYPE.NET_TALK_PCM;
talkEncode.dwSampleRate = 16000;
talkEncode.nAudioBit = 16;
talkEncode.nPacketPeriod = 25;
talkEncode.write();
if(LoginModule.netsdk.CLIENT_SetDeviceMode(LoginModule.m_hLoginHandle, NetSDKLib.EM_USEDEV_MODE.NET_TALK_ENCODE_TYPE, talkEncode.getPointer())) {
System.out.println("Set Talk Encode Type Succeed!");
} else {
System.err.p