本篇介紹海康威視攝像機通過SDK開啟關閉實時預覽介面
下篇介紹實時預覽的回撥函式及解碼庫
測試環境:
系統:Centos 7
SDK:裝置網路SDK Linux64
實時預覽模組流程:
圖中虛線框部分的模組是與預覽模組相關,必須在啟動預覽後才能呼叫,這些模組之間是並列的 關係,各自完成相應的功能。
關於SDK初始化和裝置登入可以看我上一篇部落格
實時預覽介面(NET_DVR_RealPlay_V40)
NativeLong NET_DVR_RealPlay_V40(NativeLong lUserID, NET_DVR_PREVIEWINFO lpPreviewInfo, FRealDataCallBack_V30 fRealDataCall, Pointer pUser);
實時預覽介面需要設定回撥函式(fRealDataCallBack_V30介面的實現類)
注意:該介面返回的視訊資料流並不能直接使用,需要使用官方解碼庫或者第三方解碼庫才能得到圖片幀資料
傳入引數
1、lUserID (NET_DVR_Login_V40等登入介面的返回值)
2、lpPreviewInfo (預覽引數)
3、fRealDataCallBack_V30 (碼流資料回撥函式)
4、pUser (使用者資料)
返回引數
-1表示失敗,其他值作為NET_DVR_StopRealPlay等函式的控制程式碼引數
NET_DVR_StopRealPlay 停止實時預覽介面
介面呼叫
/**
* 開始其實預覽 設定實時流回撥函式
*
* @param nativeLong
* @author 雲深小麥
*/
private NativeLong startRealPlay(NativeLong nativeLong) {
HCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();
previewInfo.lChannel = new NativeLong(1);
previewInfo.dwStreamType = 0;
previewInfo.dwLinkMode = 0;
previewInfo.hPlayWnd = null;
previewInfo.bBlocked = false;
previewInfo.bPassbackRecord = true;
previewInfo.byPreviewMode = 0;
previewInfo.byProtoType = 1;
previewInfo.dwDisplayBufNum = 15;
previewInfo.write();
NativeLong realPlayV40 = HKNETSDK.NET_DVR_RealPlay_V40(nativeLong, previewInfo, cbRealData, null);
if (realPlayV40.intValue() < 0) {
log.error("streamServiceImpl.startRealPlay.NET_DVR_RealPlay_V40 error:{}", HKNETSDK.NET_DVR_GetLastError());
throw new StreamException(HKNETSDK.NET_DVR_GetLastError());
}
return realPlayV40;
}
NET_DVR_GetLastError:返回最後操作的錯誤碼
建議沒次呼叫SDK裡的介面都列印一下這個介面,返回0代表沒有錯誤,就怕列印別的
預覽引數說明:NET_DVR_PREVIEWINFO
lChannel
通道號,目前裝置模擬通道號從1開始,數字通道的起始通道號通過NET_DVR_GetDVRConfig(配置命令NET_DVR_GET_IPPARACFG_V40)獲取(dwStartDChan)。
dwStreamType
碼流型別:0-主碼流,1-子碼流,2-三碼流,3-虛擬碼流,以此類推
dwLinkMode
連線方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP,6- HRUDP(可靠傳輸) ,7- RTSP/HTTPS,8- NPQ
hPlayWnd
播放視窗的控制程式碼,為NULL表示不解碼顯示。
bBlocked
0- 非阻塞取流,1- 阻塞取流
若設為不阻塞,表示發起與裝置的連線就認為連線成功,如果發生碼流接收失敗、播放失敗等情況以預覽異常的方式通知上層。在迴圈播放的時候可以減短停頓的時間,與NET_DVR_RealPlay處理一致。
若設為阻塞,表示直到播放操作完成才返回成功與否,網路異常時SDK內部connect失敗將會有5s的超時才能夠返回,不適合於輪詢取流操作。
bPassbackRecord
是否啟用錄影回傳:0-不啟用錄影回傳,1-啟用錄影回傳。ANR斷網補錄功能,客戶端和裝置之間網路異常恢復之後自動將前端資料同步過來,需要裝置支援。
byPreviewMode
延遲預覽模式:0- 正常預覽,1- 延遲預覽
byStreamID
流ID,為字母、數字和"_"的組合,lChannel為0xffffffff時啟用此引數
byProtoType
應用層取流協議:0- 私有協議,1- RTSP協議。主子碼流支援的取流協議通過登入返回結構引數NET_DVR_DEVICEINFO_V30的byMainProto、bySubProto值得知。裝置同時支援私協議和RTSP協議時,該引數才有效,預設使用私有協議,可選RTSP協議。
byRes1
保留,置為0
byVideoCodingType
碼流資料編解碼型別:0- 通用編碼資料,1- 熱成像探測器產生的原始資料(溫度資料的加密資訊,通過去加密運算,將原始資料算出真實的溫度值)
dwDisplayBufNum
播放庫播放緩衝區最大緩衝幀數,取值範圍:1、6(預設,自適應播放模式)、15,置0時預設為1
byNPQMode
NPQ模式:0- 直連模式,1-過流媒體模式
byRes
保留,置為0
備註
1、 dwStreamType(碼流型別)、dwLinkMode(連線方式)、bPassbackRecord(錄影回傳)、byPreviewMode(延遲預覽模式)、byStreamID(流ID)這些引數的取值需要裝置支援。
2、 NET_DVR_RealPlay_V40支援多播方式預覽(dwLinkMode設為2),不需要傳多播組地址,底層自動從裝置獲取已配置的多播組地址(NET_DVR_NETCFG_V50中的引數struMulticastIpAddr)並以該多播組地址實現多播。
3、 碼流型別包含主碼流、子碼流、三碼流、事件碼流和虛擬碼流等,
4、 當dwLinkMode == 7的時候,同時byProtoType == 1的時候,表示RTP over HTTPS預覽。
停止實時預覽(NET_DVR_StopRealPlay)
傳入引數
1、lRealHandle(NET_DVR_RealPlay或者NET_DVR_RealPlay_V30的返回值)
返回引數
true 表示成功,false 表示失敗。
介面呼叫
/**
* 停止實時預覽
*
* @return nativeLong
* @author 雲深小麥
*/
private void stopRealPlay(NativeLong nativeLong) {
boolean response = HKNETSDK.NET_DVR_StopRealPlay(nativeLong);
if (!response) {
log.info("streamServiceImpl.stopRealPlay.NET_DVR_StopRealPlay error:{}", HKNETSDK.NET_DVR_GetLastError());
}
}
程式碼寫的太亂,我還在整理中。。。
注意:so動態庫是linux版本的,windows版本的有部分介面不一樣