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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM