最近項目用到了一個調用海康威視攝像頭實現外網網頁預覽的需求,由於第一次接觸這類需求,不免有些焦頭爛額,現終於將需求實現,故,作一筆記用於記憶,並希望幫到要用的人。廢話不多說,直接開始:
注:本文中所有的使用的代碼和工具以及安裝包的下載地址如下:
傳送門: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同胞們,希望對你們有所幫助!
本文內容純手打!轉載請註明出處,謝謝!
另:本文一切需下載的文件,均可在頁頭鏈接處一次性下載完成!