大华设备播放过程中设置播放速度

这篇博客探讨了在视频监控客户端中处理网络不稳定时的播放速度控制问题。作者指出,大华SDK使用帧率而非速率计算播放速度,转换计算会增加工作量。文章展示了如何通过调整帧率直接设置播放速度,包括暂停、快进、快退等操作,并提供了相关代码示例。此外,还提及了在速度变化方向相反时的处理逻辑。
摘要由CSDN通过智能技术生成

背景


以前做了很多年的视频监控客户端,有段时间是接入大华,海康,axis,一传等sdk,在我们自己的监控系统中使用。

在网络不稳定的时候,控制播放速度总是让人头痛的事情。
设置播放速度有两种方法,一种是按照速度进行传递和计算,一种是按照帧率来计算。
因为大华的sdk默认使用帧率来计算,如果换算成速率工作量很大,出力不讨好。不如直接调用接口,设置帧率。

设置速率仅仅使用原来暂停状态,就有这样的工作量。

代码

void CDevReplay::SetPlaySpeed( DOUBLE dOldSpeed, DOUBLE dNewSpeed )
{
	if(dOldSpeed == dNewSpeed)//不改变原来的速度
	{
		return 0;
	}
	if (dNewSpeed >= (-0.01) && dNewSpeed <= 0.01)
	{
		PauseOrContinue(1);//如果设置为0,暂停;
		return;
	}

	PauseOrContinue(0);
	if (dOldSpeed >= (-0.01) && dOldSpeed <= 0.01)
	{
		if (dNewSpeed < (-1.01) && dOldSpeed >= -8.00)
		{
			SetPlayDirection(TRUE);
			while(dNewSpeed < -1.01)
			{
				FastPlay();
				dNewSpeed += 1.0;
			}
		}
		else if (dOldSpeed <= -0.99 && dOldSpeed >= -1.01)
		{
			NormalPlay();
		}
		else if (dNewSpeed < (-0.01) && dNewSpeed > -0.99)
		{
			SetPlayDirection(TRUE);
			while(dNewSpeed > -1.0)
			{
				SlowPlay();
				dNewSpeed *= 2.0;
			}
		}
		else if ( dNewSpeed > 0.01 && dOldSpeed < 0.99)
		{
			while(dNewSpeed < 1.0)
			{
				SlowPlay();
				dNewSpeed *= 2.0;
			}
		}
		else if (dOldSpeed >= 0.99 && dOldSpeed <= 1.01)
		{
			NormalPlay();
		}
		else if (dOldSpeed > 1.01 && dOldSpeed < 8.00)
		{
			while(dNewSpeed > -1.01)
			{
				FastPlay();
				dNewSpeed -= 1.0;
			}
		}
	}
	else if(dOldSpeed > 0.01)
	{
	...
	}
	else if(dOldSpeed < -0.01)
	{
	...
	}
	return ;
}

void CDevReplay::SetPlaySpeed( DOUBLE dOldSpeed, DOUBLE dNewSpeed )
{
	if(dOldSpeed == dNewSpeed)//不改变原来的速度
	{
		return 0;
	}
	if (dNewSpeed >= (-0.01) && dNewSpeed <= 0.01)
	{
		PauseOrContinue(1);//如果设置为0,暂停;
		return;
	}

	if (dOldSpeed >= (-0.01) && dOldSpeed <= 0.01)
	{
		dOldSpeed = 1.0;
	}
	if (dOldSpeed * dNewSpeed < 0)
	{
		BOOL bBackward = (dNewSpeed < 0);
		SetPlayDirection(bBackward);
		NormalPlay();
		return;
	}

	PauseOrContinue(0);

	LONG nRate = GetFrameRate();
	DOUBLE fZoom = dNewSpeed/dOldSpeed;
	nRate = nRate*fZoom;
	SetFrameRate(nRate);

	return ;
}

LONG CDevReplay::GetFrameRate()
{
	if(0 == m_lPlayBack)return 10;

	int fileframerate = 25;
	int playframerate = 25;
	BOOL bRet = CLIENT_GetFramePlayBack(m_lPlayBack,&fileframerate,&playframerate);
	ATLASSERT(bRet);

	return playframerate;
}

LONG CDevReplay::SetFrameRate( LONG nRate )
{
	if(0 == m_lPlayBack)return 0;

	//设置回放帧率,目前定义的范围是(1~120),超过这个范围返回FALSE
	if (nRate < 1)nRate = 1;

	BOOL bRet =  CLIENT_SetFramePlayBack(m_lPlayBack,nRate);
	ATLASSERT(bRet);

	return 1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微澜-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值