碼雲(Gitee)地址:https://gitee.com/banmajio/HCSDKtoRTMP
github地址:https://github.com/banmajio/HCSDKtoRTMP
個人博客: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上配置的設備碼率上限的值即可。