码云(Gitee)主页:https://gitee.com/banmajio
github主页:https://github.com/banmajio
个人博客:banmajio’s blog
问题描述
在进行海康sdk二次开发过程中,通过海康sdk来进行历史回放时,发现回调函数执行的特别快,导致要回放5分钟左右的视频经过20秒所有就完成了。
带来的影响就是,播放器点击暂停,过5秒后再点击播放,画面时间点可能已经偏移了1分钟。正确的方式应该是和实时预览保持一致,比如暂停到再次点击播放按钮的时间间隔应该与画面时间点偏移时间间隔一致。
问题分析
通过咨询海康的技术支持了解到,在进行历史回放的时候,设备是按照最大码流速度来发送数据的,数据流控制需要自己去实现。也就是说在进行实时预览时,每1s回调的数据量就是1s视频的实际大小,而进行历史回放的时候,回调的数据是从nvr缓存的视频文件里来的,相当于下载这个历史视频的文件,1s回调的数据量是下载1s得到的数据量。
解决方法
通过sdk控制历史回放的回调数据的速度。
fPlayDataCallBack = new PlayDataCallBack(outputStream);
// 注册回调函数
HCNetSDK.INSTANCE.NET_DVR_SetPlayDataCallBack(lHisPlayHandle, fPlayDataCallBack,0);
// 控制录像回放状态 开始回放
HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(lHisPlayHandle,HCNetSDK.NET_DVR_PLAYSTART, 0, null);
// 控制历史回放拉流推流时的速度和直播一致
HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(lHisPlayHandle, HCNetSDK.NET_DVR_SETSPEED,
bitrate, null);
其中将bitrate设置成nvr上配置的设备码率上限的值即可。