1. 程式人生 > >海康威視 java B/S 開發 流程

海康威視 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同胞們,希望對你們有所幫助!

本文內容純手打!轉載請註明出處,謝謝!

另:本文一切需下載的檔案,均可在頁頭連結處一次性下載完成!