天天看點

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

作者:一碼程式

在流媒體日趨成熟的今天,大家每天都會刷大量視訊,又或者擁有一部手機就能遠端檢視家裡的監控;那作為新手的你,怎麼從無到有打造自己的流媒體平台呢?

這裡我們選用wvp+ZLMediaKit開源平台,WEB VIDEO PLATFORM(wvp)是一個基于GB28181-2016标準實作的網絡視訊平台,支援NAT穿透,支援海康、大華、宇視等品牌的IPC、NVR、DVR接入。支援國标級聯,支援rtsp/rtmp等視訊流轉發到國标平台,支援rtsp/rtmp等推流轉發到國标平台。

一、準備工作

1.安裝所需工具

maven(管理java代碼依賴)、ffmpeg、nodejs(版本根據自己項目的需要安裝,我本人安裝的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根據個人情況下載下傳不同版本,本人使用的是2017,windows最好也用這個版本)、Cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue編輯器可自行選擇,我使用的是HBuilder X。

2.從github克隆zlm代碼

# 國内使用者推薦從同步鏡像網站gitee下載下傳 
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千萬不要忘記執行這句指令
git submodule update --init
           

3.同理克隆wvp代碼

git clone https://github.com/648540858/wvp-GB28181-pro.git           

二、開始編譯工作

1.編譯前端代碼

前端代碼采用的是vue+element編寫,是以你如果想要深入學習,可以相應的去熟悉一下vue的文法和element的元件用法。

# 進入前端目錄
cd wvp-GB28181-pro/web_src/
# 安裝依賴指令
npm --registry=https://registry.npm.taobao.org install
# 打包指令
npm run build
# 本地運作指令
npm run dev
# 當然,如果你喜歡用yarn,這裡也可以換成yarn指令去操作,具體實作可以自行研究一下           

2.編譯wvp

在編譯之前,我們需要對配置檔案進行配置,項目目錄如下所示:

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

項目檔案目錄預覽

該項目資料庫在sql檔案夾裡,點選打開之後就會看到一個sql檔案。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

資料庫檔案

開發者可以自行導入資料庫裡。随着wvp版本更新,資料庫可能會有差異,具體以實際檔案為準。

資料庫表預覽(具體以新版本資料庫為準)

項目配置檔案位于src\main\resources目錄下,如果開發者采用打包即用,不用指定配置檔案的情況下,可以修改application-local.yml,如果指定其他配置檔案,可以在application.yml裡修改。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

配置檔案路徑預覽

注意,以下配置的操作都是在application-local.yml配置檔案裡完成。

(1)配置資料庫

spring:
    devtools:
        restart:
            additional-paths: src/main/java
    thymeleaf:
        cache: false
    # REDIS資料庫配置
    redis:
        # [必須修改] Redis伺服器IP, REDIS安裝在本機的,使用127.0.0.1
        host: 127.0.0.1
        # [必須修改] 端口号
        port: 6379
        # [可選] 資料庫 DB
        database: 6
        # [可選] 通路密碼,若你的redis伺服器沒有設定密碼,就不需要用密碼去連接配接
        password: 
        # [可選] 逾時時間
        timeout: 10000
    # [可選] jdbc資料庫配置, 項目使用sqlite作為資料庫,一般不需要配置
    datasource:
        # 使用mysql 打開23-28行注釋, 删除29-36行
        #        name: eiot
        #        url: jdbc:sqlite::resource:wvp.sqlite
        #        username:
        #        password:
        #        type: com.alibaba.druid.pool.DruidDataSource
        #        driver-class-name:  org.sqlite.JDBC
        name: wvp
        url: jdbc:mysql://127.0.0.1:3306/wvp-1?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=UTC
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
           

(2)配置server伺服器啟動端口

# [可選] WVP監聽的HTTP端口, 網頁和接口調用都是這個端口
server:
    port: 18080           

(3)28181服務配置

# 作為28181伺服器的配置
sip:
     # [必須修改] 本機的IP,這裡是我本地ip
    ip: 10.10.10.110
    # [可選] 28181服務監聽的端口
    port: 6060
    # 根據國标6.1.2中規定,domain宜采用ID統一編碼的前十位編碼。國标附錄D中定義前8位為中心編碼(由省級、市級、區級、基層編号組成,參照GB/T 2260-2007)
    # 後兩位為行業編碼,定義參照附錄D.3
    # 3701020049辨別山東濟南曆下區 資訊行業接入
    # [可選]
    domain: 4401020049
    # [可選]
    id: 44010200492000000001
    # [可選] 預設裝置認證密碼,移除密碼将不進行校驗
    password: 1234567890           

(4)zlm預設伺服器配置(wvp啟動的時候會去尋找預設的zlm伺服器)

#zlm 預設伺服器配置
media:
    # [必須修改] zlm伺服器唯一id,用于觸發hook時差別是哪台伺服器,general.mediaServerId
    id:
    # [必須修改] zlm伺服器的内網IP
    ip: 10.10.10.110
    # [可選] 傳回流位址時的ip,置空使用 media.ip
    stream-ip:
    # [可選] wvp在國标信令中使用的ip,此ip為錄影機可以通路到的ip, 置空使用 media.ip
    sdp-ip:
    # [可選] zlm伺服器的hook所使用的IP, 預設使用sip.ip
    hook-ip:
    # [必須修改] zlm伺服器的http.port
    http-port: 80
    # [可選] zlm伺服器的http.sslport, 置空使用zlm配置檔案配置
    http-ssl-port:
    # [可選] zlm伺服器的rtmp.port, 置空使用zlm配置檔案配置
    rtmp-port:
    # [可選] zlm伺服器的rtmp.sslport, 置空使用zlm配置檔案配置
    rtmp-ssl-port:
    # [可選] zlm伺服器的 rtp_proxy.port, 置空使用zlm配置檔案配置
    rtp-proxy-port:
    # [可選] zlm伺服器的 rtsp.port, 置空使用zlm配置檔案配置
    rtsp-port:
    # [可選] zlm伺服器的 rtsp.sslport, 置空使用zlm配置檔案配置
    rtsp-ssl-port:
    # [可選] 是否自動配置ZLM, 如果希望手動配置ZLM, 可以設為false, 不建議新接觸的使用者修改
    auto-config: true
    # [可選] zlm伺服器的hook.admin_params=secret
    secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc
    # 啟用多端口模式, 多端口模式使用端口區分每路流,相容性更好。 單端口使用流的ssrc區分, 點播逾時建議使用多端口測試
    rtp:
        # [可選] 是否啟用多端口模式, 開啟後會在portRange範圍内選擇端口用于媒體流傳輸
        enable: true
        # [可選] 在此範圍内選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動配置此屬性可能不成功
        port-range: 30000,30500 # 端口範圍
    # 錄像輔助服務, 部署此服務可以實作zlm錄像的管理與下載下傳, 0 表示不使用
    record-assist-port: 0           

(5)其他配置(具體可根據業務自行調整)

# [根據業務需求配置]
user-settings:
    # 推流直播是否錄制
    record-push-live: true
    auto-apply-play: false
    # [可選] 部分裝置需要擴充SDP,需要打開此設定
    senior-sdp: false
    # 儲存移動位置曆史軌迹:true:保留曆史資料,false:僅保留最後的位置(預設)
    save-position-history: false
    # 點播/錄像回放 等待逾時時間,機關:毫秒
    play-timeout: 18000
    # 上級點播等待逾時時間,機關:毫秒
    platform-play-timeout: 60000
    # 是否開啟接口鑒權
    interface-authentication: true
    # 接口鑒權例外的接口, 即不進行接口鑒權的接口,盡量詳細書寫,盡量不用/**,至少兩級目錄
    interface-authentication-excludes:
        - /api/v1/**
    # 國标是否錄制
    record-sip: true
    # 是否将日志存儲進資料庫
    logInDatebase: true
    # 使用推流狀态作為推流通道狀态
    use-pushing-as-status: true
    # 使用來源請求ip作為streamIp,當且僅當你隻有zlm節點它與wvp在一起的情況下開啟
    use-source-ip-as-stream-ip: true
    # 國标點播 按需拉流, true:有人觀看拉流,無人觀看釋放, false:拉起後不自動釋放
    stream-on-demand: true
    # 推流鑒權, 預設開啟
    push-authority: true
    # 國标級聯發流嚴格模式,嚴格模式會使用與sdp資訊中一緻的端口發流,端口共享media.rtp.port-range,這會損失一些性能,
    # 非嚴格模式使用随機端口發流,性能更好, 預設關閉
    gb-send-stream-strict: false
    # 裝置上線時是否自動同步通道
    sync-channel-on-device-online: false
    # 是否使用裝置來源Ip作為回複IP, 不設定則為 false
    sip-use-source-ip-as-remote-address: false
    # 是否開啟sip日志
    sip-log: true
    # 自動資料庫更新,保證表結構完整
    sync-db: false
           

(6)編譯wvp

啟動IntelliJ IDEA,打開wvp項目,開始編譯。看到出現這樣的界面,表明編譯并且運作成功。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

編譯wvp

3.編譯zlm

(1)打開安裝好的Cmake,選擇zlm項目所在位置,并且選擇你build項目時的位置,這裡我們就放在同一目錄下,友善管理。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

選擇項目目錄和build目錄

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

下一步,點選Yes

(2)點選Configure

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

(3)點選Genrate,可以看到兩個步驟都提示成功了。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

(4)選擇打開項目,就會自動打開Visual Studio 2017

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?
怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

打開項目

(5)這裡我們直接可以按下圖操作,你也可以選擇Release

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

選擇之後點選本地Windows調試器

(6)這裡編譯需要一定時間,耐心等待。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

編譯成功

(7)出現編譯完成的提示後,去項目目錄下找到Debug目錄或者Release目錄。目錄位置位于release目錄下

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

zlm應用程式入口目錄

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

最終應用程式

(8)這裡我們不能直接點選MediaServer.exe,需要對其進行配置,我們在上一個目錄,會看到一個config.ini檔案,打開并将它複制到MediaServer.exe所在目錄。當然,你也可以直接打開MediaServer.exe,然後它也會在目前目錄自動生成一個config.ini檔案,你打開config.ini進去配置即可。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

配置檔案示例

(9)zlm配置檔案詳細配置如下,開發者可根據自己的實際情況調整

#!!!!此配置檔案為範例配置檔案,意在告訴讀者,各個配置項的具體含義和作用,
#!!!!該配置檔案在執行cmake時,會拷貝至release/${作業系統類型}/${編譯類型}(例如release/linux/Debug) 檔案夾。
#!!!!該檔案夾(release/${作業系統類型}/${編譯類型})同時也是可執行程式生成目标路徑,在執行MediaServer程序時,它會預設加載同目錄下的config.ini檔案作為配置檔案,
#!!!!你如果修改此範例配置檔案(conf/config.ini),并不會被MediaServer程序加載,因為MediaServer程序預設加載的是release/${作業系統類型}/${編譯類型}/config.ini。
#!!!!當然,你每次執行cmake,該檔案确實會被拷貝至release/${作業系統類型}/${編譯類型}/config.ini,
#!!!!但是一般建議你直接修改release/${作業系統類型}/${編譯類型}/config.ini檔案,修改此檔案一般不起作用,除非你運作MediaServer時使用-c參數指定到此檔案。

[api]
#是否調試http api,啟用調試後,會列印每次http請求的内容和回複
apiDebug=1
#一些比較敏感的http api在通路時需要提供secret,否則無權限調用
#如果是通過127.0.0.1通路,那麼可以不提供secret
secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#截圖儲存路徑根目錄,截圖通過http api(/index/api/getSnap)生成和擷取
snapRoot=./www/snap/
#預設截圖圖檔,在啟動FFmpeg截圖後但是截圖還未生成時,可以傳回預設的預設圖檔
defaultSnap=./www/logo.png

[ffmpeg]
#FFmpeg可執行程式路徑,支援相對路徑/絕對路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的指令模闆,通過該模闆可以設定再編碼的一些參數
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的指令,可以通過修改該配置改變截圖分辨率或品質
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(相對于本可執行程式目錄)或絕對路徑
log=./ffmpeg/ffmpeg.log
# 自動重新開機的時間(秒), 預設為0, 也就是不自動重新開機. 主要是為了避免長時間ffmpeg拉流導緻的不同步現象
restart_sec=0

#轉協定相關開關;如果addStreamProxy api和on_publish hook回複未指定轉協定參數,則采用這些配置項
[protocol]
#轉協定時,是否開啟幀級時間戳覆寫
modify_stamp=0
#轉協定是否開啟音頻
enable_audio=1
#添加acc靜音音頻,在關閉音頻時,此開關無效
add_mute_audio=1
#推流斷開後可以在逾時時間内重新連接配接上繼續推流,這樣播放器會接着播放。
#置0關閉此特性(推流斷開會導緻立即斷開播放器)
#此參數不應大于播放器逾時時間;機關毫秒
continue_push_ms=15000

#是否開啟轉換為hls
enable_hls=1
#是否開啟MP4錄制
enable_mp4=0
#是否開啟轉換為rtsp/webrtc
enable_rtsp=1
#是否開啟轉換為rtmp/flv
enable_rtmp=1
#是否開啟轉換為http-ts/ws-ts
enable_ts=1
#是否開啟轉換為http-fmp4/ws-fmp4
enable_fmp4=1

#是否将mp4錄制當做觀看者
mp4_as_player=0
#mp4切片大小,機關秒
mp4_max_second=3600
#mp4錄制儲存路徑
mp4_save_path=./www

#hls錄制儲存路徑
hls_save_path=./www

###### 以下是按需轉協定的開關,在測試ZLMediaKit的接收推流性能時,請把下面開關置1
###### 如果某種協定你用不到,你可以把以下開關置1以便節省資源(但是還是可以播放,隻是第一個播放者體驗稍微差點),
###### 如果某種協定你想擷取最好的使用者體驗,請置0(第一個播放者可以秒開,且不花屏)
#hls協定是否按需生成,如果hls.segNum配置為0(意味着hls錄制),那麼hls将一直生成(不管此開關)
hls_demand=0
#rtsp[s]協定是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協定是否按需生成
rtmp_demand=0
#http[s]-ts協定是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協定是否按需生成
fmp4_demand=0

[general]
#是否啟用虛拟主機
enableVhost=0
#播放器或推流器在斷開後會觸發hook.on_flow_report事件(使用多少流量事件),
#flowThreshold參數控制觸發hook.on_flow_report事件門檻值,使用流量超過該門檻值後才觸發,機關KB
flowThreshold=1024
#播放最多等待時間,機關毫秒
#播放在播放某個流時,如果該流不存在,
#ZLMediaKit會最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個時間内,該流注冊成功,那麼會立即傳回播放器播放成功
#否則傳回播放器未找到該流,該機制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個流無人觀看時,觸發hook.on_stream_none_reader事件的最大等待時間,機關毫秒
#在配合hook.on_stream_none_reader事件時,可以做到無人觀看自動停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流代理時如果斷流再重連成功是否删除前一次的媒體流資料,如果删除将重新開始,
#如果不删除将會接着上一次的資料繼續寫(錄制hls/mp4時會繼續在前一個檔案後面寫)
resetWhenRePlay=1
#合并寫緩存大小(機關毫秒),合并寫指伺服器緩存一定的資料後才會一次性寫入socket,這樣能提高性能,但是會提高延時
#開啟後會同時關閉TCP_NODELAY并開啟MSG_MORE
mergeWriteMS=0
#伺服器唯一id,用于觸發hook時差別是哪台伺服器,
#這裡需要修改成自己定義的,your_server_id隻是提示你是你自己伺服器的id
#很多新手看都不看就原封不動的使用
mediaServerId=your_server_id

#最多等待未初始化的Track時間,機關毫秒,逾時之後會忽略未初始化的Track
wait_track_ready_ms=10000
#如果流隻有單Track,最多等待若幹毫秒,逾時後未收到其他Track的資料,則認為是單Track
#如果協定中繼資料有聲明特定track數,那麼無此等待時間
wait_add_track_ms=3000
#如果track未就緒,我們先緩存幀資料,但是有最大個數限制,防止記憶體溢出
unready_frame_cache=100

[hls]
#hls寫檔案的buf大小,調整參數可以提高檔案io性能
fileBufSize=65536
#hls最大切片時間
segDur=2
#m3u8索引中,hls保留切片個數(實際保留切片個數大2~3個)
#如果設定為0,則不删除切片,而是儲存為點播
segNum=3
#HLS切片從m3u8檔案中移除後,繼續保留在磁盤上的個數
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls檔案删除延時,機關秒,issue: #913
deleteDelaySec=10
#是否保留hls檔案,此功能部分等效于segNum=0的情況
#不同的是這個保留不會在m3u8檔案中展現
#0為不保留,不起作用
#1為保留,則不删除hls檔案,如果開啟此功能,注意磁盤大小,或者定期手動清理hls檔案
segKeep=0

[hook]
#在推流時,如果url參數匹對admin_params,那麼可以不經過hook鑒權直接推流成功,播放時亦然
#該配置項的目的是為了開發者自己調試測試,該參數暴露後會有洩露隐私的安全隐患
admin_params=secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#是否啟用hook事件,啟用後,推拉流都将進行鑒權
enable=0
#播放器或推流器使用流量事件,置空則關閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#通路http檔案鑒權事件,置空則關閉鑒權
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權事件,置空則關閉鑒權
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權事件,置空則關閉鑒權
on_publish=https://127.0.0.1/index/hook/on_publish
#錄制mp4切片完成事件
on_record_mp4=https://127.0.0.1/index/hook/on_record_mp4
# 錄制 hls ts 切片完成事件
on_record_ts=https://127.0.0.1/index/hook/on_record_ts
#rtsp播放鑒權事件,此事件中比對rtsp的使用者名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權事件,置空則關閉rtsp鑒權。rtsp播放鑒權還支援url方式鑒權
#建議開發者統一采用url參數方式鑒權,rtsp使用者名密碼鑒權一般在裝置上用的比較多
#開啟rtsp專屬鑒權後,将不再觸發on_play鑒權事件
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠端telnet調試鑒權事件
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊或登出事件
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無人觀看流事件,通過該事件,可以選擇是否關閉無人觀看的流。配合general.streamNoneReaderDelayMS選項一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時,未找到流事件,通過配合hook.on_stream_none_reader事件可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#伺服器啟動報告,可以用于伺服器的崩潰重新開機事件監聽
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server保活上報
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#發送rtp(startSendRtp)被動關閉時回調
on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped
#rtp server 逾時未收到資料
on_rtp_server_timeout=https://127.0.0.1/index/hook/on_rtp_server_timeout

#hook api最大等待回複時間,機關秒
timeoutSec=10
#keepalive hook觸發間隔,機關秒,float類型
alive_interval=10.0
#hook通知失敗重試次數,正整數。為0不重試,1時重試一次,以此類推
retry=1
#hook通知失敗重試延時,機關秒,float型
retry_delay=3.0

[cluster]
#設定源站拉流url模闆, 格式跟printf類似,第一個%s指定app,第二個%s指定stream_id,
#開啟叢集模式後,on_stream_not_found和on_stream_none_reader hook将無效.
#溯源模式支援以下類型:
#rtmp方式: rtmp://127.0.0.1:1935/%s/%s
#rtsp方式: rtsp://127.0.0.1:554/%s/%s
#hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8
#http-ts方式: http://127.0.0.1:80/%s/%s.live.ts
#支援多個源站,不同源站通過分号(;)分隔
origin_url=
#溯源總逾時時長,機關秒,float型;假如源站有3個,那麼單次溯源逾時時間為timeout_sec除以3
#單次溯源逾時時間不要超過general.maxStreamWaitMS配置
timeout_sec=15
#溯源失敗嘗試次數,-1時永久嘗試
retry_count=3

[http]
#http伺服器字元編碼,windows上預設gb2312
charSet=utf-8
#http連結逾時時間
keepAliveSecond=30
#http請求體最大位元組數,如果post的body太大,則不适合緩存body在記憶體
maxReqSize=40960
#404網頁内容,使用者可以自定義404網頁
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您通路的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http伺服器監聽端口
port=80
#http檔案伺服器根目錄
#可以為相對(相對于本可執行程式目錄)或絕對路徑
rootPath=./www
#http檔案伺服器讀檔案緩存大小,機關BYTE,調整該參數可以優化檔案io性能
sendBufSize=65536
#https伺服器監聽端口
sslport=443
#是否顯示檔案夾菜單,開啟後可以浏覽檔案夾
dirMenu=1
#虛拟目錄, 虛拟目錄名和檔案路徑使用","隔開,多個配置路徑間用";"隔開
#例如指派為 app_a,/path/to/a;app_b,/path/to/b 那麼
#通路 http://127.0.0.1/app_a/file_a 對應的檔案路徑為 /path/to/a/file_a
#通路 http://127.0.0.1/app_b/file_b 對應的檔案路徑為 /path/to/b/file_b
#通路其他http路徑,對應的檔案路徑還是在rootPath内
virtualPath=
#禁止字尾的檔案使用mmap緩存,使用“,”隔開
#例如指派為 .mp4,.flv
#那麼通路字尾為.mp4與.flv 的檔案不緩存
forbidCacheSuffix=
#可以把http代理前真實用戶端ip放在http頭中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否則可能導緻僞造用戶端ip
forwarded_ip_header=

[multicast]
#rtp多點傳播截止多點傳播ip位址
addrMax=239.255.255.255
#rtp多點傳播起始多點傳播ip位址
addrMin=239.0.0.0
#多點傳播udp ttl
udpTTL=64

[record]
#mp4錄制或mp4點播的應用名,通過限制應用名,可以防止随意點播
#點播的檔案必須放置在此檔案夾下
appName=record
#mp4錄制寫檔案緩存,機關BYTE,調整參數可以提高檔案io性能
fileBufSize=65536
#mp4點播每次流化資料量,機關毫秒,
#減少該值可以讓點播資料發送量更平滑,增大該值則更節省cpu資源
sampleMS=500
#mp4錄制完成後是否進行二次關鍵幀索引寫入頭部
fastStart=0
#MP4點播(rtsp/rtmp/http-flv/ws-flv)是否循環播放檔案
fileRepeat=0

[rtmp]
#rtmp必須在此時間内完成握手,否則伺服器會斷開連結,機關秒
handshakeSecond=15
#rtmp逾時時間,如果該時間内未收到用戶端的資料,
#或者tcp發送緩存超過這個時間,則會斷開連接配接,機關秒
keepAliveSecond=15
#在接收rtmp推流時,是否重新生成時間戳(很多推流器的時間戳着實很爛)
modifyStamp=0
#rtmp伺服器監聽端口
port=1935
#rtmps伺服器監聽位址
sslport=0

[rtp]
#音頻mtu大小,該參數限制rtp最大位元組數,推薦不要超過1400
#加大該值會明顯增加直播延時
audioMtuSize=600
#視訊mtu大小,該參數限制rtp最大位元組數,推薦不要超過1400
videoMtuSize=1400
#rtp包最大長度限制,機關KB,主要用于識别TCP上下文破壞時,擷取到錯誤的rtp
rtpMaxSize=10
# rtp 打包時,低延遲開關,預設關閉(為0),h264存在一幀多個slice(NAL)的情況,在這種情況下,如果開啟可能會導緻畫面花屏
lowLatency=0

[rtp_proxy]
#導出調試資料(包括rtp/ps/h264)至該目錄,置空則關閉資料導出
dumpDir=
#udp和tcp代理伺服器,支援rtp(必須是ts或ps類型)代理
port=10000
#rtp逾時時間,機關秒
timeoutSec=15
#随機端口範圍,最少確定36個端口
#該範圍同時限制rtsp伺服器udp端口範圍
port_range=30000-35000
#rtp h264 負載的pt
h264_pt=98
#rtp h265 負載的pt
h265_pt=99
#rtp ps 負載的pt
ps_pt=96
#rtp opus 負載的pt
opus_pt=100

[rtc]
#rtc播放推流、播放逾時時間
timeoutSec=15
#本機對rtc用戶端的可見ip,作為伺服器時一般為公網ip,可有多個,用','分開,當置空時,會自動擷取網卡ip
#同時支援環境變量,以$開頭,如"$EXTERN_IP"; 請參考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp伺服器監聽端口号,所有rtc用戶端将通過該端口傳輸stun/dtls/srtp/srtcp資料,
#該端口是多線程的,同時支援用戶端網絡切換導緻的連接配接遷移
#需要注意的是,如果伺服器在nat内,需要做端口映射時,必須確定外網映射端口跟該端口一緻
port=8000
#rtc tcp伺服器監聽端口号,在udp 不通的情況下,會使用tcp傳輸資料
#該端口是多線程的,同時支援用戶端網絡切換導緻的連接配接遷移
#需要注意的是,如果伺服器在nat内,需要做端口映射時,必須確定外網映射端口跟該端口一緻
tcpPort = 8000
#設定remb比特率,非0時關閉twcc并開啟remb。該設定在rtc推流時有效,可以控制推流畫質
#目前已經實作twcc自動調整碼率,關閉remb根據真實網絡狀況調整碼率
rembBitRate=0
#rtc支援的音頻codec類型,在前面的優先級更高
#以下範例為所有支援的音頻codec
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
#rtc支援的視訊codec類型,在前面的優先級更高
#以下範例為所有支援的視訊codec
preferredCodecV=H264,H265,AV1,VP9,VP8

[srt]
#srt播放推流、播放逾時時間,機關秒
timeoutSec=5
#srt udp伺服器監聽端口号,所有srt用戶端将通過該端口傳輸srt資料,
#該端口是多線程的,同時支援用戶端網絡切換導緻的連接配接遷移
port=9000
#srt 協定中延遲緩存的估算參數,在握手階段估算rtt ,然後latencyMul*rtt 為最大緩存時長,此參數越大,表示等待重傳的時長就越大
latencyMul=4
#包緩存的大小
pktBufSize=8192


[rtsp]
#rtsp專有鑒權方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流代理是否是直接代理模式
#直接代理後支援任意編碼格式,但是會導緻GOP緩存無法定位到I幀,可能會導緻開播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu會導緻無法使用udp方式代理
#假定您的拉流源位址不是264或265或AAC,那麼你可以使用直接代理的方式來支援rtsp代理
#如果你是rtsp推拉流,但是webrtc播放,也建議關閉直接代理模式,
#因為直接代理時,rtp中可能沒有sps pps,會導緻webrtc無法播放; 另外webrtc也不支援Single NAL Unit Packets類型rtp
#預設開啟rtsp直接代理,rtmp由于沒有這些問題,是強制開啟直接代理的
directProxy=1
#rtsp必須在此時間内完成握手,否則伺服器會斷開連結,機關秒
handshakeSecond=15
#rtsp逾時時間,如果該時間内未收到用戶端的資料,
#或者tcp發送緩存超過這個時間,則會斷開連接配接,機關秒
keepAliveSecond=15
#rtsp伺服器監聽位址
port=554
#rtsps伺服器監聽位址
sslport=0
#rtsp 轉發是否使用低延遲模式,當開啟時,不會緩存rtp包,來提高并發,可以降低一幀的延遲
lowLatency=0
[shell]
#調試telnet伺服器接受最大bufffer大小
maxReqSize=1024
#調試telnet伺服器監聽端口
port=0           

(10)點選MediaServer.exe啟動zlm,出現如下界面,說明啟動成功。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

4.運作前端程式

(1)編譯程式

# 進入前端目錄
cd wvp-GB28181-pro/web_src/           
怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

這裡幾乎不需要修改,也可以自行根據實際情況修改

(2)運作程式

# 本地運作指令
npm run dev           
怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

出現這樣的提示說明運作成功

(3)出現上圖的提示說明成功,在浏覽器輸入http://127.0.0.1:8082,即可通路前端頁面

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

使用者登入

(4)首頁看闆展示

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

首頁看闆

三、裝置接入

(1)這裡我們以大華攝像頭為例

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

攝像頭配置界面

(2)編輯好相應參數後,點選确定即可注冊到平台。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

裝置注冊上平台

(3)點播裝置,測試是否正常拉流

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

通道資訊

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

實際拉流效果

到這裡zlm+wvp流媒體平台搭建教程就結束了,對于新手的開發者,可以讓他們少走不少彎路,好将更多的時間用在二次開發和産品打磨上。本文不足和沒有涉及到的地方,歡迎留言指正!

最後附上我在此架構上二次開發的項目截圖,目前已經運用在實際項目中,有相關經驗開發者的可以留言交流。

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

首頁看闆

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

視訊監控

怎樣從一個新手,實作windows搭建wvp+zlm流媒體平台?

系統運作情況

ps:最後感謝zlm架構和wvp架構作者,提供這麼好的開源架構~

繼續閱讀