码云(Gitee)地址:https://gitee.com/banmajio/HCSDKtoRTMP
github地址:https://github.com/banmajio/HCSDKtoRTMP
个人博客:banmajio’s blog
海康sdk二次开发系列文章
海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP)
海康sdk进行历史回放时,码流数据回调过快问题的解决方法
海康sdk项目(java)部署Linux环境相关问题总结
海康sdk部署Linux环境下无法播放子码流的问题
海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误
问题描述
在进行海康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上配置的设备码率上限的值即可。