海康威視攝像機Java SDK拉流(二)開啟關閉實時預覽

雲深小麥發表於2021-12-28

本篇介紹海康威視攝像機通過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版本的有部分介面不一樣

相關文章