C++|海康摄像头实时预览时设置音量大小

使用海康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++程序媛~

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糯诺诺米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值