需求
基于大华设备网络sdk(netsdk)做二次开发,实现基于大华ipc的录像回放功能。
大华设备网络sdk版本:General_NetSDK_Chn_Win32_IS_V3.055.0000000.0.R.210524
问题
在进行录像回放时,应用层进行录像拖动,将拖动的偏移位置信息传给自定义接口,自定义接口调用大华sdk的录像偏移接口,但是录像回放回调的数据并未刷新,导致上层进度条滑动了,但是画面并未刷新。
录像回放部分代码如下:
//播放进度状态回调
void CALLBACK PlayCallBack(LLONG lPlayHandle, DWORD dwTotalSize, DWORD dwDownLoadSize, LDWORD dwUser)
{
// 处理进度回调: 用于判断是否播放完成
}
//回放数据回调函数
int CALLBACK PBDataCallBack(LLONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, LDWORD dwUser)
{
// 处理回调数据, 回调数据用于播放器播放
// 注意: 此处必须返回1, 返回其他值会有问题
return 1;
}
int StartPlayBackByTime()
{
// 赋值流程略
NET_TIME stime, etime;
// 开始按时间回放
LLONG playHandle = CLIENT_PlayBackByTimeEx((LLONG)LoginID, channelID,
&stime, &etime, NULL, PlayCallBack,
(LDWORD)this, PBDataCallBack, (LDWORD)this);
if(playHandle > 0)
{
return 0;
}
else
{
return -1;
}
}
int SetPBPosition(int64_t pos)
{
// 拖动
if(pos > 0)
{
int offsettime = (int)((pos - oldpos)/1000);
if(offsettime > 0)
{
// offsettime有效时,第三个参数无效
if(!CLIENT_SeekPlayBack((LLONG)pbHandle, offsettime, 0))
{
return -1;
}
}
return 0;
}
return -1;
}
修改
经码流分析和询问大华官方,录像偏移接口已不支持此种方式拖动,新的实现方式为先关闭录像,然后在根据传入的pos重新打开录像。
修改后的代码如下:
int SetPBPosition(int64_t pos)
{
// 停止按时间回放
CLIENT_StopPlayBack((LLONG)pbHandle);
// 重新开始按时间回放
LLONG playHandle = CLIENT_PlayBackByTimeEx((LLONG)LoginID, channelID,
&stime, &etime, NULL, PlayCallBack,
(LDWORD)this, PBDataCallBack, (LDWORD)this);
if(playHandle > 0)
{
return 0;
}
else
{
return -1;
}
}