最近在研究一個攝像頭,通信協議是 gb/t28181。對于這個協議也是第一次接觸,通過查閱多方資料,找到了兩個開源的源碼,來實現 視頻播放、攝像頭直播。以前也沒有深入的了解過關于視頻播放的這方面的技術,偶爾網站播放視頻 也都是 mp4視頻,通過html標簽直接播放。通過這次的學習,對于視頻播放的技術有了一部分的了解。這篇文章主要是講解 怎么搭建一下 我找的這兩個開源的源碼服務,從來對gb/t28181協議的設備 進行一個管理。
源碼1:ZLMediaKit
https://github.com/ZLMediaKit/ZLMediaKit
對于ZLMediaKit 源碼 他提供 docker部署的 方案,所以我們就不需要下載源碼自行編譯了
這個服務 我們主要是用來做視頻流轉換與播放等等
源碼2:wvp-GB28181-pro
https://github.com/648540858/wvp-GB28181-pro
對于這個源碼 已經集成了各種設備協議和ZLMediaKit的使用。
他是帶前后端的管理系統,如果你們已經有了前端頁面。可以只是用他的后端,通過api的方式調用即可。
好了,簡單的介紹了這兩個項目。
接下來我們來搭建 ZLMediaKit
docker 部署:
- 拉取官方鏡像
docker pull zlmediakit/zlmediakit:master
- 首次運行臨時容器
docker run -d --name zlmediakit-tmp zlmediakit/zlmediakit:master
- 提取默認配置文件
# 創建宿主機配置目錄
mkdir /home/zlmediakit/conf
# 復制容器內配置文件到宿主機
docker cp zlmediakit-tmp:/home/zlmediakit/conf/config.ini /opt/zlmediakit/conf/
# 刪除臨時容器
docker rm -f zlmediakit-tmp
- 修改config.ini配置文件
[api]
secret = your_custom_secret # 必須修改默認值[rtp_proxy]# 端口范圍需與容器映射一致 這個拉流的時候 隨機使用的端口# 如果設備同時在線多 再增加即可 現在是500個端口
port_range = 30000-30500 [http]
port = 9092 # 保持與容器映射端口對應
allow_ip_range = 0.0.0.0/0 # 允許所有IP訪問
ssl_port=443 # 若開啟HTTPS 默認443 也可以改成別的 8443[rtmp]
port=1935 # 必須與Docker映射的容器端口一致[websocket]
port=9000 # 若開啟WebSocket[general]
mediaServerId = sdaafdgfdgferdz #服務器唯一id 可自定義
配置文件別的 一般情況就不需要改了,當 wvp-GB28181-pro 源碼啟動的時候 和 ZLMediaKit 服務建立通信成功后 ,wvp-GB28181-pro 會把 一些參數 同步到 config.ini 配置文件里。
最后啟動ZLMediaKit :
docker-compose.yml 文件方式啟動:
大家可以根據自己的需求自行修改
version: "3.7"services:zlmediakit:image: zlmediakitports:- "1935:1935" # rtmp 端口- "9092:9092" # web 80端口- "8443:8443" # web 443端口- "8554:8554" # rtsp 端口- "10000:10000" # rtp_proxy 端口- "10000:10000/udp" # rtp 代理端口 udp- "8000:8000/udp" # rtc 端口- "9000:9000/udp" # srt 端口- "30000-30500:30000-30500/tcp" # rtp 代理端口范圍(WebRTC/RTP轉發)- "30000-30500:30000-30500/udp" # rtp 代理端口范圍(WebRTC/RTP轉發)restart: alwayscontainer_name: zlmediakitvolumes:- /home/lianxi/ZLMediaKit/conf/config.ini:/opt/media/conf/config.ini # 配置文件
注意:zlmediakit 服務的 9092 web 端口 通過瀏覽器可以直接訪問,可以訪問到一些目錄結構,還不知道有沒有安全方面的影響,目前不知道怎么關閉。有知道的小伙伴也歡迎留言~
這個 wvp-GB28181-pro 項目他默認是 3個 配置文件夾 我給他整合成1個了。
我修改后的 application.yml 配置文件 和上面的這個 docker-compose.yml是配到的。
更多配置 可以去翻看他的源碼里有。
application.yml 內容:
spring:application:name: wvpprofiles:active: dev # 設置接口超時時間mvc:async:request-timeout: 20000thymeleaf:cache: false # [可選] 上傳文件大小限制servlet:multipart:max-file-size: 10MBmax-request-size: 100MBcache:type: redis # REDIS數據庫配置redis:# [必須修改] Redis服務器IP, REDIS安裝在本機的, 使用127.0.0.1host: 127.0.0.1 # [必須修改] 端口號port: 6379# [可選] 數據庫 DBdatabase: 1# [可選] 訪問密碼, 若你的redis服務器沒有設置密碼,就不需要用密碼去連接password: 123456# [可選] 超時時間timeout: 10000mysql:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/gb28181?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername: rootpassword: root# [可選] WVP監聽的HTTP端口, 網頁和接口調用都是這個端口
server:port: 18080
# [可選] HTTPS配置, 默認不開啟ssl:# [可選] 是否開啟HTTPS訪問enabled: false# [可選] 證書文件路徑,放置在resource/目錄下即可,修改xxx為文件名key-store: classpath:test.monitor.89iot.cn.jks# [可選] 證書密碼key-store-password: gpf64qmw# [可選] 證書類型, 默認為jks,根據實際修改key-store-type: JKS# 作為28181服務器的配置
sip:# [可選] 28181服務監聽的端口port: 8116# 根據國標6.1.2中規定,domain宜采用ID統一編碼的前十位編碼。國標附錄D中定義前8位為中心編碼(由省級、市級、區級、基層編號組成,參照GB/T 2260-2007) 后兩位為行業編碼,定義參照附錄D.3# [可選] domain: 4101050000# [可選] id: 41010500002000000001# [可選] 默認設備認證密碼,后續擴展使用設備單獨密碼, 移除密碼將不進行校驗password: 12345678# 是否存儲alarm告警信息alarm: false# zlm 默認服務器配置
media:id: sdaafdgfdgferdz # 要和 zlmediakit 服務配置文件里mediaServerId一致# [必須修改] zlm服務器的內網IPip: 192.168.0.110# [必須修改] zlm服務器的http.porthttp-port: 9092# 要和 zlmediakit docker映射的端口一致http-ssl-port: 8443rtmp-port: 1935rtsp-port: 8554# [必選選] zlm服務器的 secretsecret: tnc4XpPRdsasawQCaslpAsaaK
# 要和 zlmediakit 服務配置文件里secret一致rtp:# [可選] 是否啟用多端口模式, 開啟后會在portRange范圍內選擇端口用于媒體流傳輸enable: true# [可選] 在此范圍內選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動配置此屬性可能不成功port-range: 30000,30500 # 端口范圍# [可選] 國標級聯在此范圍內選擇端口發送媒體流, send-port-range: 30000,30500send-port-range: 30000,30500 # 端口范圍# [根據業務需求配置]
user-settings:# 點播/錄像回放 等待超時時間, 單位:毫秒play-timeout: 180000# [可選] 自動點播, 使用固定流地址進行播放時,如果未點播則自動進行點播, 需要rtp.enable=trueauto-apply-play: true# 推流直播是否錄制record-push-live: false# 國標是否錄制record-sip: false# 國標點播 按需拉流, true:有人觀看拉流,無人觀看釋放, false:拉起后不自動釋放stream-on-demand: true# 是否返回Date屬性,true:不返回,避免攝像頭通過該參數自動校時,false:返回,攝像頭可能會根據該時間校時disable-date-header: falseserverId: sdaafdgfdgferdz
# 關閉在線文檔(生產環境建議關閉)
springdoc:api-docs:enabled: falseswagger-ui:enabled: false
對于 wvp-GB28181-pro 項目部署 這里就不說了 ,非常簡單 把數據庫 表導入到數據庫 ,數據庫配置一下
java8 環境 idea編輯器 啟動即可
網上找的模擬設備協議工具 進行9屏播放效果
最后:非常感謝這些大佬們開源的源碼,讓我了解了這么多關于視頻播放的相關編程知識,向大佬致敬~