使用海康API设置音量的函数是:NET_DVR_OpenSound。
在实际代码中我遇到了以下问题:
1:调用NET_DVR_OpenSound接口一直返回失败,错误是调用顺序出错。
2:音量设置不成功。
对于以上两种问题,我相信很多人都遇到了,前段时间尝试了各种方式,终于解决了!
下面我来讲述下我的解决方法把,希望对有需要的人有用!
在海康的设备网络SDK使用手册中,有这样一个调用流程,如图所示:
根据调用流程可以知道,先要调用NET_DVR_RealPlay_V30后才能调用NET_DVR_OpenSound接口。
但实际会发现,直接调用会有问题,一直返回错误说是调用顺序出错。那究竟是哪里出错了呢?看调用流程也没有问题呀?
经过测试发现,直接调用出错是因为相机的画面没有显示出来!!这是非常重要的。
此时,在调用NET_DVR_RealPlay_V30时,需要添加回调函数,要把NET_DVR_OpenSound放到回调函数中进行调用,实现方法如下:
NET_DVR_CLIENTINFO ClientInfo;//播放
memset(&ClientInfo, 0, sizeof(NET_DVR_CLIENTINFO));
ClientInfo.hPlayWnd = hwnd;//播放用控件
ClientInfo.lChannel = 1;
ClientInfo.lLinkMode = 0; //主流码
ClientInfo.sMultiCastIP = NULL;
LONG playHandle = NET_DVR_RealPlay_V30(loginID,&ClientInfo,g_ExceptionCallBack_RealPlay, nullptr);
if(playHandle==-1)
{DWORD dwErrorCode = NET_DVR_GetLastError();return false;
}
回调函数实现,如下:
//实时预览回调数据
void CALLBACK g_ExceptionCallBack_RealPlay(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser)
{//qDebug() << QStringLiteral("g_ExceptionCallBack_RealPlay返回数据类型:") << dwDataType;
}
经过查询SDK使用手册可以了解回调函数的具体参数情况,那么在什么情况下调用打开声音的函数呢?
当dwDataType == NET_DVR_SYSHEAD,接收到系统头数据后就可以调用了,并且该类型只会在打开时调用一次,不会出现频繁调用的现象!
//实时预览回调数据
void CALLBACK g_ExceptionCallBack_RealPlay(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser)
{//qDebug() << QStringLiteral("g_ExceptionCallBack_RealPlay返回数据类型:") << dwDataType;switch (dwDataType){case NET_DVR_SYSHEAD: //系统头,打开流{//打开声音bool bRet = NET_DVR_OpenSound(lRealHandle);if (bRet == FALSE){DWORD dwErrorCode = NET_DVR_GetLastError();qDebug() << QStringLiteral("<HKCameraControl::CameraPlay> NET_DVR_OpenSound设置声音的模仿模式错误!错误码:") << dwErrorCode;}}break;}
}
到这里,实时预览的摄像头声音NET_DVR_OpenSound函数就可以调用成功了!
接下来如果设置音量。
在这里,大家需要注意箭头指向的参数,取值范围在[0, 0xFFFF],不是我们常用的0-100的十进制数了。因为在设置的时候我并没有过多关注这一点,导致打开声音后无论怎么设置都没有音量,还研究了很长时间。
下面我把设置音量的代码分享给大家,需要对大家有所帮助!
//设置音量
WORD wTemp = (0xFFFF) / 100;
WORD wVolumevalue = (WORD)(50 * wTemp);
bRet = NET_DVR_Volume(lRealHandle, 0);
if (bRet == FALSE)
{DWORD dwErrorCode = NET_DVR_GetLastError();}
以上就是我解决出现两个问题的方法了。
能够成功实现后会发现,代码很简单,难得是不知道什么时候调用,以及对参数的正确引用。
我是糯诺诺米团,一名C++程序媛~