日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ZLMediaKit+wvp-GB28181-pro,搭建28181協議視頻平臺

一,簡介

ZLMediaKit:實現RTSP/RTMP/HLS/HTTP協議的輕量級流媒體框架,支持大并發連接請求

一個基于C++11的高性能運營級流媒體服務框架,項目地址:ZLMediaKit

特點:

  • 基于C++11開發,避免使用裸指針,代碼穩定可靠,性能優越。
  • 支持多種協議(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/WebRTC),支持協議互轉。
  • 使用多路復用/多線程/異步網絡IO模式開發,并發性能優越,支持海量客戶端連接。
  • 代碼經過長期大量的穩定性、性能測試,已經在線上商用驗證已久。
  • 支持linux、macos、ios、android、windows全平臺。
  • 支持畫面秒開、極低延時(500毫秒內,最低可達100毫秒)。
  • 提供完善的標準C API,可以作SDK用,或供其他語言調用。
  • 提供完整的MediaServer服務器,可以免開發直接部署為商用服務器。
  • 提供完善的restful api以及web hook,支持豐富的業務邏輯。
  • 打通了視頻監控協議棧與直播協議棧,對RTSP/RTMP支持都很完善。
  • 全面支持H265/H264/AAC/G711/OPUS。
  • 功能完善,支持集群、按需轉協議、按需推拉流、先播后推、斷連續推等功能。
  • 極致性能,單機10W級別播放器,100Gb/s級別io帶寬能力。
  • 極致體驗,獨家特性
  • 誰在使用zlmediakit?
  • 全面支持ipv6網絡

項目定位:

  • 移動嵌入式跨平臺流媒體解決方案。
  • 商用級流媒體服務器。
  • 網絡編程二次開發SDK。

  • RTSP[S]

    • RTSP[S] 服務器,支持RTMP/MP4/HLS轉RTSP[S],支持亞馬遜echo show這樣的設備
    • RTSP[S] 播放器,支持RTSP代理,支持生成靜音音頻
    • RTSP[S] 推流客戶端與服務器
    • 支持 rtp over udp rtp over tcp rtp over http rtp組播 四種RTP傳輸方式
    • 服務器/客戶端完整支持Basic/Digest方式的登錄鑒權,全異步可配置化的鑒權接口
    • 支持H265編碼
    • 服務器支持RTSP推流(包括rtp over udp rtp over tcp方式)
    • 支持H264/H265/AAC/G711/OPUS編碼,其他編碼能轉發但不能轉協議
  • RTMP[S]

    • RTMP[S] 播放服務器,支持RTSP/MP4/HLS轉RTMP
    • RTMP[S] 發布服務器,支持錄制發布流
    • RTMP[S] 播放器,支持RTMP代理,支持生成靜音音頻
    • RTMP[S] 推流客戶端
    • 支持http[s]-flv直播
    • 支持websocket-flv直播
    • 支持H264/H265/AAC/G711/OPUS編碼,其他編碼能轉發但不能轉協議
    • 支持RTMP-H265
    • 支持RTMP-OPUS
  • HLS

    • 支持HLS文件生成,自帶HTTP文件服務器
    • 通過cookie追蹤技術,可以模擬HLS播放為長連接,可以實現HLS按需拉流、播放統計等業務
    • 支持HLS播發器,支持拉流HLS轉rtsp/rtmp/mp4
    • 支持H264/H265/AAC/G711/OPUS編碼
  • TS

    • 支持http[s]-ts直播
    • 支持ws[s]-ts直播
    • 支持H264/H265/AAC/G711/OPUS編碼
  • fMP4

    • 支持http[s]-fmp4直播
    • 支持ws[s]-fmp4直播
    • 支持H264/H265/AAC/G711/OPUS編碼
  • HTTP[S]與WebSocket

    • 服務器支持目錄索引生成,文件下載,表單提交請求
    • 客戶端提供文件下載器(支持斷點續傳),接口請求器,文件上傳器
    • 完整HTTP API服務器,可以作為web后臺開發框架
    • 支持跨域訪問
    • 支持http客戶端、服務器cookie
    • 支持WebSocket服務器和客戶端
    • 支持http文件訪問鑒權
  • GB28181與RTP推流

    • 支持UDP/TCP RTP(PS/TS/ES)推流服務器,可以轉換成RTSP/RTMP/HLS等協議
    • 支持RTSP/RTMP/HLS等協議轉rtp推流客戶端,支持TCP/UDP模式,提供相應restful api,支持主動被動方式。
    • 支持H264/H265/AAC/G711/OPUS編碼
    • 支持??礶home推流
    • 支持GB28181主動拉流模式
  • MP4點播與錄制

    • 支持錄制為FLV/HLS/MP4
    • RTSP/RTMP/HTTP-FLV/WS-FLV支持MP4文件點播,支持seek
    • 支持H264/H265/AAC/G711/OPUS編碼
  • WebRTC

    • 支持WebRTC推流,支持轉其他協議
    • 支持WebRTC播放,支持其他協議轉WebRTC
    • 支持雙向echo test
    • 支持simulcast推流
    • 支持上下行rtx/nack丟包重傳
    • 支持單端口、多線程、客戶端網絡連接遷移(開源界唯一)。
    • 支持TWCC rtcp動態調整碼率
    • 支持remb/pli/sr/rr rtcp
    • 支持rtp擴展解析
    • 支持GOP緩沖,webrtc播放秒開
    • 支持datachannel
  • SRT支持

  • 其他

    • 支持豐富的restful api以及web hook事件
    • 支持簡單的telnet調試
    • 支持配置文件熱加載
    • 支持流量統計、推拉流鑒權等事件
    • 支持虛擬主機,可以隔離不同域名
    • 支持按需拉流,無人觀看自動關斷拉流
    • 支持先播放后推流,提高及時推流畫面打開率
    • 提供c api sdk
    • 支持FFmpeg拉流代理任意格式的流
    • 支持http api生成并返回實時截圖
    • 支持按需解復用、轉協議,當有人觀看時才開啟轉協議,降低cpu占用率
    • 支持溯源模式的集群部署,溯源方式支持rtsp/rtmp/hls/http-ts, 邊沿站支持hls, 源站支持多個(采用round robin方式溯源)
    • rtsp/rtmp/webrtc推流異常斷開后,可以在超時時間內重連推流,播放器無感知

wvp-GB28181-pro: 開箱即用的28181協議視頻平臺

WEB VIDEO PLATFORM是一個基于GB28181-2016標準實現的開箱即用的網絡視頻平臺,負責實現核心信令與設備管理后臺部分,支持NAT穿透,支持海康、大華、宇視等品牌的IPC、NVR接入。支持國標級聯,支持將不帶國標功能的攝像機/直播流/直播推流轉發到其他國標平臺。

項目地址:wvp-GB28181-pro

使用文檔:使用文檔

應用場景:

  • 支持瀏覽器無插件播放攝像頭視頻。
  • 支持攝像機、平臺、NVR等設備接入。 支持國標級聯。
  • 支持rtsp/rtmp等視頻流轉發到國標平臺。
  • 支持rtsp/rtmp等推流轉發到國標平臺。

基礎特性:

  • 視頻預覽;
  • 云臺控制(方向、縮放控制);
  • 視頻設備信息同步;
  • 離在線監控;
  • 錄像查詢與回放(基于NVR\DVR,暫不支持快進、seek操作);
  • 無人觀看自動斷流;
  • 支持UDP和TCP兩種國標信令傳輸模式;
  • 集成web界面, 不需要單獨部署前端服務, 直接利用wvp內置文件服務部署, 隨wvp一起部署;
  • 支持平臺接入, 針對大平臺大量設備的情況進行優化;
  • 支持檢索,通道篩選;
  • 支持自動配置ZLM媒體服務, 減少因配置問題所出現的問題;
  • 支持啟用udp多端口模式, 提高udp模式下媒體傳輸性能;
  • 支持通道是否含有音頻的設置;
  • 支持通道子目錄查詢;
  • 支持udp/tcp國標流傳輸模式;
  • 支持直接輸出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多種協議流地址
  • 支持國標網絡校時
  • 支持公網部署, 支持wvp與zlm分開部署
  • 支持播放h265, g.711格式的流(需要將closeWaitRTPInfo設為false)
  • 報警信息處理,支持向前端推送報警信息
  • 新特性:

  • 集成web界面, 不需要單獨部署前端服務, 直接利用wvp內置文件服務部署, 隨wvp一起部署;
  • 支持平臺接入, 針對大平臺大量設備的情況進行優化;
  • 支持檢索,通道篩選;
  • 支持自動配置ZLM媒體服務, 減少因配置問題所出現的問題;
  • 支持啟用udp多端口模式, 提高udp模式下媒體傳輸性能;
  • 支持通道是否含有音頻的設置;
  • 支持通道子目錄查詢;
  • 支持udp/tcp國標流傳輸模式;
  • 支持直接輸出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多種協議流地址
  • 支持國標網絡校時
  • 支持公網部署, 支持wvp與zlm分開部署
  • 支持播放h265, g.711格式的流
  • 支持固定流地址和自動點播,同時支持未點播時直接播放流地址,代碼自動發起點播. ( 查看WIKI)
  • 報警信息處理,支持向前端推送報警信息
  • 支持訂閱與通知方法
    • 移動位置訂閱
    • 移動位置通知處理
    • 報警事件訂閱
    • 報警事件通知處理
    • 設備目錄訂閱
    • 設備目錄通知處理
    • 移動位置查詢和顯示,可通過配置文件設置移動位置歷史是否存儲

    支持特性:

    國標通道向上級聯

    • WEB添加上級平臺

    • 注冊

    • 心跳保活

    • 通道選擇

    • 通道推送

    • 點播

    • 云臺控制

    • 平臺狀態查詢

    • 平臺信息查詢

    • 平臺遠程啟動

    • 每個級聯平臺可自定義的虛擬目錄

    • 目錄訂閱與通知

    • 錄像查看與播放

    • GPS訂閱與通知(直播推流)

    • 添加RTSP視頻

    • 添加接口鑒權

    • 添加RTMP視頻

    • 云端錄像(需要部署單獨服務配合使用)

    • 多流媒體節點,自動選擇負載最低的節點使用。

    • WEB端支持播放H264與H265,音頻支持G.711A/G.711U/AAC,覆蓋國標常用編碼格式。

    • 支持電子地圖。

    • 支持接入WGS84和GCJ02兩種坐標系。

    二,部署

    我這里的部署方式是分開獨立部署,你也可以根據 wvp-GB28181-pro項目下,docker目錄下面的dockerFile,一起部署。

    建議去github,去查看該文件,因為gitee上面該文件已經很久沒更新了。我這里打不開github就不截圖了。

    ZLMediaKit 部署

    這里采用docker部署,因為需要c++環境以及一些依賴,這里建議docker直接部署。對于docker不了解的,可以查看我之前的docker系列博客,這里就不再多撰述了

    docker系列地址:docker

    啟動容器成功,你需要將容器內的:/opt/media/conf/config.ini 拷貝出來,到你綁定的目錄

    #拉取鏡像 docker pull zlmediakit/zlmediakit:master#此鏡像為github持續集成自動編譯推送,跟代碼(master分支)保持最新狀態 docker run -d -p 1935:1935 -p 18180:80 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 30000-30500:30000-30500 -p 30000-30500:30000-30500/udp --name zlmediakit --restart=always --env MODE=standalone -e TZ="Asia/Shanghai" -v /home/docker/zlmediakit/media/conf:/opt/media/conf 12bb9d80c9a2 /bin/bash -c 'MediaServer /opt/media/conf/config.ini'
    • -d:后臺運行

    • -p:綁定端口

    • -name: 容器名稱

    • –restart : 自啟

    • –env : 環境變量

    • -e TZ:時區

    • -v:綁定文件

    • -c : 指定文件啟動

    知識點:config.ini 文件,66行 mediaServerId 服務器id 是 wvp-pro 需要的,這里很重要

    知識點:需要將你的防火墻把 ZLMediaKit 的端口全部開放,阿里云或者其他云的服務器記得把安全組的端口也放開,注意上面端口有UDP,TCP

    • linux查看開放端口列表:

      [root@localhost local]# firewall-cmd --list-ports
    • linux開放指定端口:

      [root@localhost local]# firewall-cmd --zone=public --add-port=9000/tcp --permanent#關閉指定端口 [root@localhost local]# firewall-cmd --zone=public --remove-port=80/tcp --permanent
    • linux重啟防火墻:

      [root@localhost local]# firewall-cmd --reload

    啟動成功:訪問localhost:18180

    如下界面,即為部署成功

    部署wvp-GB28181-pro

    clone地址:https://gitee.com/pan648540858/wvp-GB28181-pro.git,將項目clone到本地

    這里強烈建議去github,去clone wvp 代碼,因為 gitee 上面的代碼很久沒有做更新了,有很多bug,我這邊是自己把bug解決了,希望你在部署的時候,去 github上面去拉取在最新代碼,少走一些彎路

    將項目里面的mysql.sql里面的文件,創建數據庫

    修改 ProxyServletConfig.class,這里主要是將serverPort,zlmProxy,recordProxy提取出來做配置化

    package com.genersoft.iot.vmp.conf;import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import org.apache.catalina.connector.ClientAbortException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.mitre.dsmiley.httpproxy.ProxyServlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.ObjectUtils;import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.ConnectException;/*** @author lin*/ @SuppressWarnings(value = {"rawtypes", "unchecked"}) @Configuration public class ProxyServletConfig {private final static Logger logger = LoggerFactory.getLogger(ProxyServletConfig.class);@Autowiredprivate IMediaServerService mediaServerService;@Value("${server.port}")private int serverPort;@Value("${zlm.zlmproxy}")private String zlmProxy;@Value("${zlm.recordproxy}")private String recordProxy;@Beanpublic ServletRegistrationBean zlmServletRegistrationBean(){ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ZlmProxyServlet(),"/zlm/*");servletRegistrationBean.setName("zlm_Proxy");servletRegistrationBean.addInitParameter("targetUri", zlmProxy);servletRegistrationBean.addUrlMappings();if (logger.isDebugEnabled()) {servletRegistrationBean.addInitParameter("log", "true");}return servletRegistrationBean;}class ZlmProxyServlet extends ProxyServlet{@Overrideprotected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());if (mediaInfo != null) {if (!ObjectUtils.isEmpty(queryStr)) {queryStr += "&secret=" + mediaInfo.getSecret();}else {queryStr = "secret=" + mediaInfo.getSecret();}}return queryStr;}/*** 異常處理*/@Overrideprotected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResonse, Exception e){try {super.handleRequestException(proxyRequest, proxyResonse, e);} catch (ServletException servletException) {logger.error("zlm 代理失敗: ", e);} catch (IOException ioException) {if (ioException instanceof ConnectException) {logger.error("zlm 連接失敗");} else if (ioException instanceof ClientAbortException) {logger.error("zlm: 用戶已中斷連接,代理終止");} else {logger.error("zlm 代理失敗: ", e);}} catch (RuntimeException exception){logger.error("zlm 代理失敗: ", e);}}/*** 對于為按照格式請求的可以直接返回404*/@Overrideprotected String getTargetUri(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);String uri = null;if (mediaInfo != null) { // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());}else {uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一個能返回404的請求而已, 其他的也可以}return uri;}/*** 動態替換請求目標*/@Overrideprotected HttpHost getTargetHost(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);HttpHost host;if (mediaInfo != null) {host = new HttpHost(mediaInfo.getIp(), mediaInfo.getHttpPort());}else {host = new HttpHost("127.0.0.1", serverPort);}return host;}/*** 根據uri獲取流媒體信息*/MediaServerItem getMediaInfoByUri(String uri){String[] split = uri.split("/");String mediaServerId = split[2];if ("default".equalsIgnoreCase(mediaServerId)) {return mediaServerService.getDefaultMediaServer();}else {return mediaServerService.getOne(mediaServerId);}}/*** 去掉url中的標志信息*/@Overrideprotected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);String url = super.rewriteUrlFromRequest(servletRequest);if (mediaInfo == null) {logger.error("[ZLM服務訪問代理],錯誤:處理url信息時未找到流媒體信息=>{}", requestURI);return url;}if (!ObjectUtils.isEmpty(mediaInfo.getId())) {url = url.replace(mediaInfo.getId() + "/", "");}return url.replace("default/", "");}}@Beanpublic ServletRegistrationBean recordServletRegistrationBean(){ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");servletRegistrationBean.setName("record_proxy");servletRegistrationBean.addInitParameter("targetUri", recordProxy);servletRegistrationBean.addUrlMappings();if (logger.isDebugEnabled()) {servletRegistrationBean.addInitParameter("log", "true");}return servletRegistrationBean;}class RecordProxyServlet extends ProxyServlet{@Overrideprotected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());String remoteHost = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());if (mediaInfo != null) {if (!ObjectUtils.isEmpty(queryStr)) {queryStr += "&remoteHost=" + remoteHost;}else {queryStr = "remoteHost=" + remoteHost;}}return queryStr;}/*** 異常處理*/@Overrideprotected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResponse, Exception e){try {super.handleRequestException(proxyRequest, proxyResponse, e);} catch (ServletException servletException) {logger.error("錄像服務 代理失敗: ", e);} catch (IOException ioException) {if (ioException instanceof ConnectException) {logger.error("錄像服務 連接失敗");} else if (ioException instanceof ClientAbortException) {logger.error("錄像服務:用戶已中斷連接,代理終止");} else {logger.error("錄像服務 代理失敗: ", e);}} catch (RuntimeException exception){logger.error("錄像服務 代理失敗: ", e);}}/*** 對于為按照格式請求的可以直接返回404*/@Overrideprotected String getTargetUri(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);String uri = null;if (mediaInfo != null) { // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getRecordAssistPort());}else {uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一個能返回404的請求而已, 其他的也可以}return uri;}/*** 動態替換請求目標*/@Overrideprotected HttpHost getTargetHost(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);HttpHost host;if (mediaInfo != null) {host = new HttpHost(mediaInfo.getIp(), mediaInfo.getRecordAssistPort());}else {host = new HttpHost("127.0.0.1", serverPort);}return host;}/*** 根據uri獲取流媒體信息*/MediaServerItem getMediaInfoByUri(String uri){String[] split = uri.split("/");String mediaServerId = split[2];if ("default".equalsIgnoreCase(mediaServerId)) {return mediaServerService.getDefaultMediaServer();}else {return mediaServerService.getOne(mediaServerId);}}/*** 去掉url中的標志信息*/@Overrideprotected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {String requestURI = servletRequest.getRequestURI();MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);String url = super.rewriteUrlFromRequest(servletRequest);if (mediaInfo == null) {logger.error("[錄像服務訪問代理],錯誤:處理url信息時未找到流媒體信息=>{}", requestURI);return url;}if (!ObjectUtils.isEmpty(mediaInfo.getId())) {url = url.replace(mediaInfo.getId() + "/", "");}return url.replace("default/", "");}}}

    application.yml

    spring:# [可選]上傳文件大小限制servlet:multipart:max-file-size: 10MBmax-request-size: 100MB# REDIS數據庫配置redis:# [必須修改] Redis服務器IP, REDIS安裝在本機的,使用127.0.0.1host: 127.0.0.1# [必須修改] 端口號port: 6379# [可選] 數據庫 DBdatabase: 8# [可選] 訪問密碼,若你的redis服務器沒有設置密碼,就不需要用密碼去連接password:# [可選] 超時時間timeout: 10000# mysql數據源datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/wvp_db?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=trueusername: rootpassword: 123456druid:initialSize: 10 # 連接池初始化連接數maxActive: 200 # 連接池最大連接數minIdle: 5 # 連接池最小空閑連接數maxWait: 60000 # 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。keepAlive: true # 連接池中的minIdle數量以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。validationQuery: select 1 # 檢測連接是否有效sql,要求是查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。testWhileIdle: true # 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。testOnBorrow: false # 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。testOnReturn: false # 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。poolPreparedStatements: false # 是否開啟PSCache,並且指定每個連線上PSCache的大小timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒filters: stat,slf4j # 配置監控統計攔截的filters,監控統計用的filter:sta, 日志用的filter:log4juseGlobalDataSourceStat: true # 合并多個DruidDataSource的監控數據# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000#stat-view-servlet.url-pattern: /admin/druid/*#[可選] WVP監聽的HTTP端口, 網頁和接口調用都是這個端口 server:port: 18080# 作為28181服務器的配置 sip:# [必須修改] 本機的IPip: 192.168.2.138# [可選] 28181服務監聽的端口port: 5060# 根據國標6.1.2中規定,domain宜采用ID統一編碼的前十位編碼。國標附錄D中定義前8位為中心編碼(由省級、市級、區級、基層編號組成,參照GB/T 2260-2007)# 后兩位為行業編碼,定義參照附錄D.3# 3701020049標識山東濟南歷下區 信息行業接入# [可選]domain: 4401020049# [可選]id: 44010200492000000001# [可選] 默認設備認證密碼,后續擴展使用設備單獨密碼, 移除密碼將不進行校驗password: admin123#zlm 默認服務器配置 media:id: PX5YGOUtvK56qhTq# [必須修改] zlm服務器的內網IPip: 內網IP# [必須修改] zlm服務器的http.porthttp-port: 8180# [可選] zlm服務器的hook.admin_params=secretsecret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc# 啟用多端口模式, 多端口模式使用端口區分每路流,兼容性更好。 單端口使用流的ssrc區分, 點播超時建議使用多端口測試rtp:# [可選] 是否啟用多端口模式, 開啟后會在portRange范圍內選擇端口用于媒體流傳輸enable: true# [可選] 在此范圍內選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動配置此屬性可能不成功port-range: 30000,30500 # 端口范圍# [可選] 國標級聯在此范圍內選擇端口發送媒體流,send-port-range: 30000,30500 # 端口范圍# 錄像輔助服務, 部署此服務可以實現zlm錄像的管理與下載, 0 表示不使用record-assist-port: 0 # [可選] 日志配置, 一般不需要改 logging:config: classpath:logback-spring-local.xmlzlm:zlmproxy: http://公網ip:6080recordproxy: http://公網ip:18081

    使用maven 打包為jar

    mvn install

    部署到服務器即可

    部署前端

    web_src 打開到該目錄下面,

    #拉取依賴 npm install#打包 npm run build

    后面使用,nginx代理部署,將前端文件里面的 index.js 后端地址,改為你的服務地址即可

    訪問頁面

    三,配置攝像頭

    這里以??禐槔?#xff0c;訪問??悼刂?#xff0c;以ip訪問

    在高級配置,配置,平臺接入方式改為28181,其他配置對應之前的wvp-pro,application.yml, 服務器地址寫你的服務器地址即可,記得開放端口

    四:總結

    不斷去發現問題,去解決問題,你才有進步,多點細心和耐心。

    總結

    以上是生活随笔為你收集整理的ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。