海康威視 java B/S 開發 流程
最近專案用到了一個呼叫海康威視攝像頭實現外網網頁預覽的需求,由於第一次接觸這類需求,不免有些焦頭爛額,現終於將需求實現,故,作一筆記用於記憶,並希望幫到要用的人。廢話不多說,直接開始:
注:本文中所有的使用的程式碼和工具以及安裝包的下載地址如下:
傳送門:
一、分析流程
整理了一下整個流程,共分以下四個步驟:
1.使用海康威視的官方SDK訪問攝像頭,獲取攝像頭可用通道號,組裝rtsp地址,獲取攝像頭的實時rtsp視訊流。
注1:12年之後海康裝置支援兩種組裝rtsp流的方式,可以不使用通道號就可以,故此步可以省略;
注2:如果不使用通道,使用量多的話會影響畫質,故,推薦使用通道號組裝rtsp地址;
2.使用FFmpeg將rtsp流轉換成rtmp流供網頁顯示。
注1:FFmpeg支援轉mp4,webm,ogg等多種前言音視訊檔案的格式轉換哦;
注2:本文使用rtmp流,有其他需求的小夥伴可以使用FFmpeg轉成其他格式;
3.伺服器搭建整合nginx-rtmp外掛的nginx服務,將轉換的rtmp流推送至nginx制定代理地址,實現外網訪問。
注1:建議有能力的公司使用單獨伺服器搭建流媒體伺服器哦。
4.前端頁面使用免費的前端H5外掛video.js實現實時預覽
注1:video.js支援mp4,webm,ogg三種格式的檔案的播放。
注2:rtmp流屬於flv格式只能用flash播放,故需要flash外掛支援;
注3:video.js只有一些版本支援flash,故,要選好版本(本文使用的是v5.20.5);
二、具體實現過程及問題解決
第一步:
自己選擇適合自己環境的SDK下載
2.下載之後解壓,目錄如下:
Demo示例中的是集中開發語言的demo,其中java的是用swing寫客戶端,C/S架構的,可以參考。
庫檔案中是需要使用的dll執行庫;是需要引進專案中的。那個txt檔案裡說了,有幾個檔案和資料夾
是必須的:
HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、
AudioRender.dll、HCNetSDKCom資料夾
3.我個人是在專案的webapp下建立了一個libraries的資料夾專一放攝像頭的庫檔案的,因為我除了海康,
還要調華為的高清視訊終端;
目錄如下:
4.然後在一個全域性工具類裡寫了一個靜態方法獲取webapp的路徑以獲取dll檔案的路徑;
由於開發環境為內網,故只能以圖片方式貼程式碼,大家將就看:
println中的是獲取的的HCNetSdk.dll的絕對路徑;
5.根據SDK壓縮包裡的那個txt檔案所說,修改SDK檔案的路徑:
注:我們不用預覽功能所以不用修改PlayCtrl的路徑,不會呼叫他的;
6.編寫工具類的各種方法,初始化,註冊裝置,獲取通道:
6.1初始化環境:
6.2註冊裝置:
6.3獲取通道:
6.4:整體呼叫獲取通道號:
這裡的註釋是推流哈,這個後邊再說;
先看到這句:int channelNumber = hcTools.getChannelNumber();就是獲取到了通道號;
看過Demo的小夥伴看了就知道我是根據demo改的哈!
7.組裝rtsp地址:
成功的rtsp地址如下:
rtsp://admin:[email protected]:554/h264/ch1/main/av_stream
解釋下
admin:裝置登入賬號;
admin123456:裝置登入密碼;
10.192.44.101:裝置的內網IP地址:
554:預設埠(注:不要變,這是取rtsp流的預設埠);
h264:是視訊流編碼格式;
ch1:通道號(注:下便會詳細介紹通道號規則);
如上為一個rtsp流的格式,具體介紹見下文:
下文為海康威視的rtsp的規則:
以下為個人對於海康的通道號的理解(原文在海康SDK開發文件內,自己扒):
海康通道號分兩種模擬通道和數字通道。
通道號是一個整形數字,在組裝rtsp地址的時候需要加上“ch”字首;
數字通道(即IP通道)在使用時要在獲得的值的基礎上加32;
以上在程式碼中都有實現。
現在我們就獲取到了一個rtsp視訊流。接下來我們測一下可以用否:
安裝vlc-2.2.4-win32.exe:一直下一步。(64位系統可用);
開啟vlc客戶端==>媒體==>流==>網路
將得到的rtsp地址放進去,然後點選圖片中串流右邊的三角選播放:
成功!第一步結束!
第二步:
這裡是已經用java包裝好的一個FFempg的工具
2.下載後開啟壓縮包
選擇jar資料夾下有一個jar包:FFmpegCommandHandler.jar
3.將這個jar包安裝到本地的maven倉庫(maven專案):
將jar包解壓之資料夾然後使用 maven 的 install:install-file命令
mvn install:install-file -DgroupId=FFmpeg -DartifactId=FFmpeg -Dversion=1.0
-Dpackaging=jar -Dfile=D:\XXX\FFmpegCommandHandler.jar;
4.進入自己的本地Maven倉庫找ffempg\ffempg\1.0\ffempg-1.0.pom
5.專案中pom.xml引入
6.FFmpeg的使用
這裡小夥伴們會看到rtmp://localhost:1935/live/,這是把轉好的rtmp流直接推送到
流媒體伺服器上的nginx服務上,因為我用的是本機做伺服器,所以是localhost;
1935是nginx-rtmp的預設埠,這是下一節的事情
第二步驟結束
第三步:
解壓到指定資料夾,開啟conf/nginx.conf檔案
這裡的live就是上邊程式碼中的rtmp://localhost:1935/live/中的live,可以自己定義
2.啟動nginx
在nginx的安裝目錄下按住shift鍵右擊滑鼠,點擊出現選單中的在此處開啟命令列
輸入命令 nginx.ece -c cong\nginx.conf 回車,nginx啟動時不能關閉命令列視窗!
有時間的小夥伴可以嘗試一下將nginx安裝為windows系統服務,這樣就可以用
net start nginx 命令啟動nginx且不會有命令列視窗開啟。
3.執行上文中出現的Java程式碼中的startTranscoding方法就可以實現推流;
這時候的推流只是將rtsp流轉為rtmp流並推送至nginx中。而產生的rtmp流地址為:
rtmp://xxx.xxx.xxx.xxx:1935/live/appName
這裡的xxx.xxx.xxx.xxx是流媒體所在伺服器的外網ip;下面是動態獲取ip的方法
這裡的appName是自定義的我用的是使用者賬號好攝像頭ip去“.”之後的組合字串
成功!第三步結束!
第四步:
1.前端選擇目前免費的H5外掛:videojs;此處注意本文頭部的注意事項
2.頁面引用
注意最後一句 videojs.options.flash.swf = "../js/videojs/video-js.swf"
本文開頭的時候說了由於rtmp流屬於flv格式,是屬於flash的專用格式。這句話的意思就是判斷當前瀏覽器是否支援H5標準或者video.js是否支援當前格式播放,如果不支援H5或者格式不允許,則預設呼叫flash播放
OK!到此一切結束,本文先給正在苦惱海康威視的java同胞們,希望對你們有所幫助!
本文內容純手打!轉載請註明出處,謝謝!
另:本文一切需下載的檔案,均可在頁頭連結處一次性下載完成!