海康威視 java B/S 開發 流程

最近項目用到了一個調用海康威視攝像頭實現外網網頁預覽的需求,由於第一次接觸這類需求,不免有些焦頭爛額,現終於將需求實現,故,作一筆記用於記憶,並希望幫到要用的人。廢話不多說,直接開始:

注:本文中所有的使用的代碼和工具以及安裝包的下載地址如下:

      傳送門:https://download.csdn.net/download/qq_36720088/10696597

     由於csdn資源價值算法的原因,資源分數過高,若csdn資源分數不夠,可移步至:demo大師

一、分析流程

整理了一下整個流程,共分以下四個步驟:

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);

二、具體實現過程及問題解決

第一步:

1.下載海康威視的最新SDK;海康威視官方SDK下載

   自己選擇適合自己環境的SDK下載

2.下載之後解壓,目錄如下:

   Demo示例中的是幾種開發語言的demo,其中java的是用swing寫客戶端,C/S架構的,可以參考。

   庫文件中是需要使用的dll運行庫;是需要引進項目中的。那個txt文件裏說了,有幾個文件和文件夾

   是必須的:

        HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、

        AudioRender.dll、HCNetSDKCom文件夾

3.我個人是在項目的webapp下創建了一個libraries的文件夾專一放攝像頭的庫文件的,因爲我除了海康,

還要調華爲的高清視訊終端;(有外網鏈接需求的朋友,可以選擇搭建一個小項目專一做流媒體服務器

(注意:java調用dll庫需要使用jna.jar)

   目錄如下:

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流的格式,具體介紹見下文:

      傳送門:https://blog.csdn.net/qq_34845917/article/details/75077712

   下文爲海康威視的rtsp的規則:

      傳送門:https://blog.csdn.net/xiejiashu/article/details/71786187

   以下爲個人對於海康的通道號的理解(原文在海康SDK開發文檔內,自己扒):

      海康通道號分兩種模擬通道和數字通道。

      通道號是一個整形數字,在組裝rtsp地址的時候需要加上“ch”前綴;

      數字通道(即IP通道)在使用時要在獲得的值的基礎上加32;

      以上在代碼中都有實現。

   現在我們就獲取到了一個rtsp視頻流。接下來我們測一下可以用否:

      安裝vlc-2.2.4-win32.exe:一直下一步。(64位系統可用);

      打開vlc客戶端==>媒體==>流==>網絡

將得到的rtsp地址放進去,然後點擊圖片中串流右邊的三角選播放:

成功!第一步結束!

第二步:

1.下載window可用的FFmpegCommandHandler,傳送門:https://blog.csdn.net/eguid_1/article/details/52968220

    這裏是已經用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,並配置環境變量

    下載地址:https://ffmpeg.zeranoe.com/builds/

    我們選擇static版本

    下載之後,將壓縮包解壓到你想安裝的地方然後複製ffmpeg.exe文件所在路徑,

    添加至系統環境變量;

7.FFmpeg的使用

    這裏小夥伴們會看到rtmp://localhost:1935/live/,這是把轉好的rtmp流直接推送到

    流媒體服務器上的nginx服務上,因爲我用的是本機做服務器,所以是localhost;

    1935是nginx-rtmp的默認端口,這是下一節的事情

第二步驟結束

第三步:

1.下載已經集成nginx-rtmp插件的nginx,傳送門:https://github.com/illuspas/nginx-rtmp-win32

    解壓到指定文件夾,打開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去“.”之後的組合字符串

    具體效果見傳送門:https://blog.csdn.net/gui66497/article/details/78590190

成功!第三步結束!

第四步:

1.前端選擇目前免費的H5插件:videojs;此處注意本文頭部的注意事項

    video.js v5.20.5 下載地址:https://github.com/videojs/video.js/releases/tag/v5.20.5

2.頁面引用

    注意最後一句 videojs.options.flash.swf = "../js/videojs/video-js.swf"

    本文開頭的時候說了由於rtmp流屬於flv格式,是屬於flash的專用格式。這句話的意思就是判斷當前瀏覽器是否支持H5標準或者video.js是否支持當前格式播放,如果不支持H5或者格式不允許,則默認調用flash播放

第五步:

使用完成後記得關閉推流進程,當然如果需求要保存視頻,可以不用關閉,一直推送,並轉換成MP4保存,關閉進程的方法在FFmpegCommandHandler的源碼包裏,自己看源碼,我文件頭步上傳的附件裏有關閉的代碼,時間來不及了了,不寫了。

 

OK!到此一切結束,本文先給正在苦惱海康威視的java同胞們,希望對你們有所幫助!

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

另:本文一切需下載的文件,均可在頁頭鏈接處一次性下載完成!

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章