本篇介紹浩菪幔康威視攝像機(jī)通過(guò)SDK開(kāi)啟關(guān)閉實(shí)時(shí)預(yù)覽接口
下篇介紹實(shí)時(shí)預(yù)覽的回調(diào)函數(shù)及解碼庫(kù)
測(cè)試環(huán)境:
系統(tǒng):Centos 7
SDK:設(shè)備網(wǎng)絡(luò)SDK Linux64
實(shí)時(shí)預(yù)覽模塊流程:
圖中虛線框部分的模塊是與預(yù)覽模塊相關(guān)侥猬,必須在啟動(dòng)預(yù)覽后才能調(diào)用傀蓉,這些模塊之間是并列的 關(guān)系勒叠,各自完成相應(yīng)的功能。
關(guān)于SDK初始化和設(shè)備登錄可以看我上一篇博客
實(shí)時(shí)預(yù)覽接口(NET_DVR_RealPlay_V40)
NativeLong NET_DVR_RealPlay_V40(NativeLong lUserID, NET_DVR_PREVIEWINFO lpPreviewInfo, FRealDataCallBack_V30 fRealDataCall, Pointer pUser);
實(shí)時(shí)預(yù)覽接口需要設(shè)置回調(diào)函數(shù)(fRealDataCallBack_V30接口的實(shí)現(xiàn)類)
注意:該接口返回的視頻數(shù)據(jù)流并不能直接使用膏孟,需要使用官方解碼庫(kù)或者第三方解碼庫(kù)才能得到圖片幀數(shù)據(jù)
傳入?yún)?shù)
1眯分、lUserID (NET_DVR_Login_V40等登錄接口的返回值)
2、lpPreviewInfo (預(yù)覽參數(shù))
3柒桑、fRealDataCallBack_V30 (碼流數(shù)據(jù)回調(diào)函數(shù))
4弊决、pUser (用戶數(shù)據(jù))
返回參數(shù)
-1表示失敗,其他值作為NET_DVR_StopRealPlay等函數(shù)的句柄參數(shù)
NET_DVR_StopRealPlay 停止實(shí)時(shí)預(yù)覽接口
接口調(diào)用
/**
* 開(kāi)始其實(shí)預(yù)覽 設(shè)置實(shí)時(shí)流回調(diào)函數(shù)
*
* @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:返回最后操作的錯(cuò)誤碼
建議沒(méi)次調(diào)用SDK里的接口都打印一下這個(gè)接口魁淳,返回0代表沒(méi)有錯(cuò)誤飘诗,就怕打印別的
預(yù)覽參數(shù)說(shuō)明:NET_DVR_PREVIEWINFO
lChannel
通道號(hào),目前設(shè)備模擬通道號(hào)從1開(kāi)始界逛,數(shù)字通道的起始通道號(hào)通過(guò)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- 阻塞取流
若設(shè)為不阻塞实昨,表示發(fā)起與設(shè)備的連接就認(rèn)為連接成功,如果發(fā)生碼流接收失敗盐固、播放失敗等情況以預(yù)覽異常的方式通知上層荒给。在循環(huán)播放的時(shí)候可以減短停頓的時(shí)間,與NET_DVR_RealPlay處理一致刁卜。
若設(shè)為阻塞志电,表示直到播放操作完成才返回成功與否,網(wǎng)絡(luò)異常時(shí)SDK內(nèi)部connect失敗將會(huì)有5s的超時(shí)才能夠返回蛔趴,不適合于輪詢?nèi)×鞑僮鳌?/p>
bPassbackRecord
是否啟用錄像回傳:0-不啟用錄像回傳挑辆,1-啟用錄像回傳。ANR斷網(wǎng)補(bǔ)錄功能,客戶端和設(shè)備之間網(wǎng)絡(luò)異秤悴酰恢復(fù)之后自動(dòng)將前端數(shù)據(jù)同步過(guò)來(lái)洒嗤,需要設(shè)備支持。
byPreviewMode
延遲預(yù)覽模式:0- 正常預(yù)覽魁亦,1- 延遲預(yù)覽
byStreamID
流ID渔隶,為字母、數(shù)字和"_"的組合洁奈,lChannel為0xffffffff時(shí)啟用此參數(shù)
byProtoType
應(yīng)用層取流協(xié)議:0- 私有協(xié)議间唉,1- RTSP協(xié)議。主子碼流支持的取流協(xié)議通過(guò)登錄返回結(jié)構(gòu)參數(shù)NET_DVR_DEVICEINFO_V30的byMainProto利术、bySubProto值得知呈野。設(shè)備同時(shí)支持私協(xié)議和RTSP協(xié)議時(shí),該參數(shù)才有效氯哮,默認(rèn)使用私有協(xié)議际跪,可選RTSP協(xié)議。
byRes1
保留喉钢,置為0
byVideoCodingType
碼流數(shù)據(jù)編解碼類型:0- 通用編碼數(shù)據(jù)姆打,1- 熱成像探測(cè)器產(chǎn)生的原始數(shù)據(jù)(溫度數(shù)據(jù)的加密信息,通過(guò)去加密運(yùn)算肠虽,將原始數(shù)據(jù)算出真實(shí)的溫度值)
dwDisplayBufNum
播放庫(kù)播放緩沖區(qū)最大緩沖幀數(shù)幔戏,取值范圍:1、6(默認(rèn)税课,自適應(yīng)播放模式)闲延、15,置0時(shí)默認(rèn)為1
byNPQMode
NPQ模式:0- 直連模式韩玩,1-過(guò)流媒體模式
byRes
保留垒玲,置為0
備注
1、 dwStreamType(碼流類型)找颓、dwLinkMode(連接方式)合愈、bPassbackRecord(錄像回傳)、byPreviewMode(延遲預(yù)覽模式)击狮、byStreamID(流ID)這些參數(shù)的取值需要設(shè)備支持佛析。
2、 NET_DVR_RealPlay_V40支持多播方式預(yù)覽(dwLinkMode設(shè)為2)彪蓬,不需要傳多播組地址寸莫,底層自動(dòng)從設(shè)備獲取已配置的多播組地址(NET_DVR_NETCFG_V50中的參數(shù)struMulticastIpAddr)并以該多播組地址實(shí)現(xiàn)多播。
3档冬、 碼流類型包含主碼流膘茎、子碼流桃纯、三碼流、事件碼流和虛擬碼流等辽狈,
4慈参、 當(dāng)dwLinkMode == 7的時(shí)候,同時(shí)byProtoType == 1的時(shí)候刮萌,表示RTP over HTTPS預(yù)覽驮配。
停止實(shí)時(shí)預(yù)覽(NET_DVR_StopRealPlay)
傳入?yún)?shù)
1、lRealHandle(NET_DVR_RealPlay或者NET_DVR_RealPlay_V30的返回值)
返回參數(shù)
true 表示成功着茸,false 表示失敗壮锻。
接口調(diào)用
/**
* 停止實(shí)時(shí)預(yù)覽
*
* @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());
}
}
代碼寫(xiě)的太亂,我還在整理中涮阔。猜绣。。
注意:so動(dòng)態(tài)庫(kù)是linux版本的敬特,windows版本的有部分接口不一樣