前沿拓展:
win7 **r
32位基本兼容所有的軟件了。
不過(guò)你說(shuō)的這個(gè)不清楚
我現(xiàn)在就在用win7,感覺很不錯(cuò),沒(méi)出現(xiàn)過(guò)不兼容的情況
在流媒體日趨成熟的今天,大家每天都會(huì)刷大量視頻,又或者擁有一部手機(jī)就能遠(yuǎn)程查看家里的**;那作為新手的你,怎么從無(wú)到有打造自己的流媒體平臺(tái)呢?
這里我們選用wvp+ZLMediaKit開源平臺(tái),WEB VIDEO PLATFORM(wvp)是一個(gè)基于GB28181-2016標(biāo)準(zhǔn)實(shí)現(xiàn)的網(wǎng)絡(luò)視頻平臺(tái),支持NAT穿透,支持海康、大華、宇視等品牌的IPC、NVR、**R接入。支持國(guó)標(biāo)級(jí)聯(lián),支持rtsp/rtmp等視頻流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái),支持rtsp/rtmp等推流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái)。
一、準(zhǔn)備工作
1.安裝所需工具
maven(管理java代碼依賴)、ffmpeg、nodejs(版本根據(jù)自己項(xiàng)目的需要安裝,我本人安裝的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根據(jù)個(gè)人情況下載不同版本,本人使用的是2017,windows最好也用這個(gè)版本)、Cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue編輯器可自行選擇,我使用的是HBuilder X。
2.從github克隆zlm代碼
# 國(guó)內(nèi)用戶推薦從同步鏡像網(wǎng)站gitee下載
git clone –depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千萬(wàn)不要忘記執(zhí)行這句命令
git submodule update –init
3.同理克隆wvp代碼
git clone https://github.com/648540858/wvp-GB28181-pro.git
二、開始編譯工作
1.編譯前端代碼
前端代碼采用的是vue+element編寫,所以你如果想要深入學(xué)習(xí),可以相應(yīng)的去熟悉一下vue的語(yǔ)法和element的組件用法。
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
# 安裝依賴命令
npm –registry=https://registry.npm.taobao.org install
# 打包命令
npm run build
# 本地運(yùn)行命令
npm run dev
# 當(dāng)然,如果你喜歡用yarn,這里也可以換成yarn命令去**作,具體實(shí)現(xiàn)可以自行研究一下
2.編譯wvp
在編譯之前,我們需要對(duì)配置文件進(jìn)行配置,項(xiàng)目目錄如下所示:
項(xiàng)目文件目錄預(yù)覽
該項(xiàng)目數(shù)據(jù)庫(kù)在sql文件夾里,點(diǎn)擊打開之后就會(huì)看到一個(gè)sql文件。
數(shù)據(jù)庫(kù)文件
開發(fā)者可以自行導(dǎo)入數(shù)據(jù)庫(kù)里。隨著wvp版本更新,數(shù)據(jù)庫(kù)可能會(huì)有差異,具體以實(shí)際文件為準(zhǔn)。
數(shù)據(jù)庫(kù)表預(yù)覽(具體以新版本數(shù)據(jù)庫(kù)為準(zhǔn))
項(xiàng)目配置文件位于srcmainresources目錄下,如果開發(fā)者采用打包即用,不用指定配置文件的情況下,可以修改application-local.yml,如果指定其他配置文件,可以在application.yml里修改。
配置文件路徑預(yù)覽
注意,以下配置的**作都是在application-local.yml配置文件里完成。
(1)配置數(shù)據(jù)庫(kù)
spring:
devtools:
restart:
additional-paths: src/main/java
thymeleaf:
cache: false
# REDIS數(shù)據(jù)庫(kù)配置
redis:
# [必須修改] Redis服務(wù)器IP, REDIS安裝在本機(jī)的,使用127.0.0.1
host: 127.0.0.1
# [必須修改] 端口號(hào)
port: 6379
# [可選] 數(shù)據(jù)庫(kù) DB
database: 6
# [可選] 訪問(wèn)密碼,若你的redis服務(wù)器沒(méi)有設(shè)置密碼,就不需要用密碼去連接
password:
# [可選] 超時(shí)時(shí)間
timeout: 10000
# [可選] jdbc數(shù)據(jù)庫(kù)配置, 項(xiàng)目使用sqlite作為數(shù)據(jù)庫(kù),一般不需要配置
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服務(wù)器啟動(dòng)端口
# [可選] WVP**的HTTP端口, 網(wǎng)頁(yè)和接口調(diào)用都是這個(gè)端口
server:
port: 18080
(3)28181服務(wù)配置
# 作為28181服務(wù)器的配置
sip:
# [必須修改] 本機(jī)的IP,這里是我本地ip
ip: 10.10.10.110
# [可選] 28181服務(wù)**的端口
port: 6060
# 根據(jù)國(guó)標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國(guó)標(biāo)附錄D中定義前8位為中心編碼(由省級(jí)、市級(jí)、區(qū)級(jí)、基層編號(hào)組成,參照GB/T 2260-2007)
# 后兩位為行業(yè)編碼,定義參照附錄D.3
# 3701020049標(biāo)識(shí)山東濟(jì)南歷下區(qū) 信息行業(yè)接入
# [可選]
domain: 4401020049
# [可選]
id: 44010200492000000001
# [可選] 默認(rèn)設(shè)備認(rèn)證密碼,移除密碼將不進(jìn)行校驗(yàn)
password: 1234567890
(4)zlm默認(rèn)服務(wù)器配置(wvp啟動(dòng)的時(shí)候會(huì)去尋找默認(rèn)的zlm服務(wù)器)
#zlm 默認(rèn)服務(wù)器配置
media:
# [必須修改] zlm服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,general.mediaServerId
id:
# [必須修改] zlm服務(wù)器的內(nèi)網(wǎng)IP
ip: 10.10.10.110
# [可選] 返回流地址時(shí)的ip,置空使用 media.ip
stream-ip:
# [可選] wvp在國(guó)標(biāo)信令中使用的ip,此ip為**可以訪問(wèn)到的ip, 置空使用 media.ip
sdp-ip:
# [可選] zlm服務(wù)器的hook所使用的IP, 默認(rèn)使用sip.ip
hook-ip:
# [必須修改] zlm服務(wù)器的http.port
http-port: 80
# [可選] zlm服務(wù)器的http.sslport, 置空使用zlm配置文件配置
http-ssl-port:
# [可選] zlm服務(wù)器的rtmp.port, 置空使用zlm配置文件配置
rtmp-port:
# [可選] zlm服務(wù)器的rtmp.sslport, 置空使用zlm配置文件配置
rtmp-ssl-port:
# [可選] zlm服務(wù)器的 rtp_proxy.port, 置空使用zlm配置文件配置
rtp-proxy-port:
# [可選] zlm服務(wù)器的 rtsp.port, 置空使用zlm配置文件配置
rtsp-port:
# [可選] zlm服務(wù)器的 rtsp.sslport, 置空使用zlm配置文件配置
rtsp-ssl-port:
# [可選] 是否自動(dòng)配置ZLM, 如果希望手動(dòng)配置ZLM, 可以設(shè)為false, 不建議新接觸的用戶修改
auto-config: true
# [可選] zlm服務(wù)器的hook.admin_params=secret
secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc
# 啟用多端口模式, 多端口模式使用端口區(qū)分每路流,兼容性更好。 單端口使用流的ssrc區(qū)分, 點(diǎn)播超時(shí)建議使用多端口測(cè)試
rtp:
# [可選] 是否啟用多端口模式, 開啟后會(huì)在portRange范圍內(nèi)選擇端口用于媒體流傳輸
enable: true
# [可選] 在此范圍內(nèi)選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動(dòng)配置此屬性可能不成功
port-range: 30000,30500 # 端口范圍
# 錄像輔助服務(wù), 部署此服務(wù)可以實(shí)現(xiàn)zlm錄像的管理與下載, 0 表示不使用
record-assist-port: 0
(5)其他配置(具體可根據(jù)業(yè)務(wù)自行調(diào)整)
# [根據(jù)業(yè)務(wù)需求配置]
user-settings:
# 推流直播是否錄制
record-push-live: true
auto-apply-play: false
# [可選] 部分設(shè)備需要擴(kuò)展SDP,需要打開此設(shè)置
senior-sdp: false
# 保存移動(dòng)位置歷史軌跡:true:保留歷史數(shù)據(jù),false:僅保留最后的位置(默認(rèn))
save-position-history: false
# 點(diǎn)播/錄像回放 等待超時(shí)時(shí)間,單位:毫秒
play-timeout: 18000
# 上級(jí)點(diǎn)播等待超時(shí)時(shí)間,單位:毫秒
platform-play-timeout: 60000
# 是否開啟接口鑒權(quán)
interface-authentication: true
# 接口鑒權(quán)例外的接口, 即不進(jìn)行接口鑒權(quán)的接口,盡量詳細(xì)書寫,盡量不用/**,至少兩級(jí)目錄
interface-authentication-excludes:
– /api/v1/**
# 國(guó)標(biāo)是否錄制
record-sip: true
# 是否將日志存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)
logInDatebase: true
# 使用推流狀態(tài)作為推流通道狀態(tài)
use-pushing-as-status: true
# 使用來(lái)源請(qǐng)求ip作為streamIp,當(dāng)且僅當(dāng)你只有zlm節(jié)點(diǎn)它與wvp在一起的情況下開啟
use-source-ip-as-stream-ip: true
# 國(guó)標(biāo)點(diǎn)播 按需拉流, true:有人觀看拉流,無(wú)人觀看釋放, false:拉起后不自動(dòng)釋放
stream-on-demand: true
# 推流鑒權(quán), 默認(rèn)開啟
push-authority: true
# 國(guó)標(biāo)級(jí)聯(lián)發(fā)流嚴(yán)格模式,嚴(yán)格模式會(huì)使用與sdp信息中一致的端口發(fā)流,端口共享media.rtp.port-range,這會(huì)損失一些性能,
# 非嚴(yán)格模式使用隨機(jī)端口發(fā)流,性能更好, 默認(rèn)關(guān)閉
gb-send-stream-strict: false
# 設(shè)備上線時(shí)是否自動(dòng)同步通道
sync-channel-on-device-online: false
# 是否使用設(shè)備來(lái)源Ip作為回復(fù)IP, 不設(shè)置則為 false
sip-use-source-ip-as-remote-address: false
# 是否開啟sip日志
sip-log: true
# 自動(dòng)數(shù)據(jù)庫(kù)升級(jí),保證表結(jié)構(gòu)完整
sync-db: false
(6)編譯wvp
啟動(dòng)IntelliJ IDEA,打開wvp項(xiàng)目,開始編譯??吹匠霈F(xiàn)這樣的界面,表明編譯并且運(yùn)行成功。
編譯wvp
3.編譯zlm
(1)打開安裝好的Cmake,選擇zlm項(xiàng)目所在位置,并且選擇你build項(xiàng)目時(shí)的位置,這里我們就放在同一目錄下,方便管理。
選擇項(xiàng)目目錄和build目錄
下一步,點(diǎn)擊Yes
(2)點(diǎn)擊Configure
(3)點(diǎn)擊Genrate,可以看到兩個(gè)步驟都提示成功了。
(4)選擇打開項(xiàng)目,就會(huì)自動(dòng)打開Visual Studio 2017
打開項(xiàng)目
(5)這里我們直接可以按下圖**作,你也可以選擇Release
選擇之后點(diǎn)擊本地Windows調(diào)試器
(6)這里編譯需要一定時(shí)間,耐心等待。
編譯成功
(7)出現(xiàn)編譯完成的提示后,去項(xiàng)目目錄下找到Debug目錄或者Release目錄。目錄位置位于release目錄下
zlm應(yīng)用程序入口目錄
最終應(yīng)用程序
(8)這里我們不能直接點(diǎn)擊MediaServer.exe,需要對(duì)其進(jìn)行配置,我們?cè)谏弦粋€(gè)目錄,會(huì)看到一個(gè)config.ini文件,打開并將它**到MediaServer.exe所在目錄。當(dāng)然,你也可以直接打開MediaServer.exe,第二它也會(huì)在當(dāng)前目錄自動(dòng)生成一個(gè)config.ini文件,你打開config.ini進(jìn)去配置即可。
配置文件示例
(9)zlm配置文件詳細(xì)配置如下,開發(fā)者可根據(jù)自己的實(shí)際情況調(diào)整
#!!!!此配置文件為范例配置文件,意在告訴讀者,各個(gè)配置項(xiàng)的具體含義和作用,
#!!!!該配置文件在執(zhí)行cmake時(shí),會(huì)拷貝至release/${**作系統(tǒng)類型}/${編譯類型}(例如release/linux/Debug) 文件夾。
#!!!!該文件夾(release/${**作系統(tǒng)類型}/${編譯類型})同時(shí)也是可執(zhí)行程序生成目標(biāo)路徑,在執(zhí)行MediaServer進(jìn)程時(shí),它會(huì)默認(rèn)加載同目錄下的config.ini文件作為配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不會(huì)被MediaServer進(jìn)程加載,因?yàn)镸ediaServer進(jìn)程默認(rèn)加載的是release/${**作系統(tǒng)類型}/${編譯類型}/config.ini。
#!!!!當(dāng)然,你每次執(zhí)行cmake,該文件確實(shí)會(huì)被拷貝至release/${**作系統(tǒng)類型}/${編譯類型}/config.ini,
#!!!!但是一般建議你直接修改release/${**作系統(tǒng)類型}/${編譯類型}/config.ini文件,修改此文件一般不起作用,除非你運(yùn)行MediaServer時(shí)使用-c參數(shù)指定到此文件。
[api]
#是否調(diào)試http api,啟用調(diào)試后,會(huì)打印每次http請(qǐng)求的內(nèi)容和回復(fù)
apiDebug=1
#一些比較敏感的http api在訪問(wèn)時(shí)需要提供secret,否則無(wú)權(quán)限調(diào)用
#如果是通過(guò)127.0.0.1訪問(wèn),那么可以不提供secret
secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#截圖保存路徑根目錄,截圖通過(guò)http api(/index/api/getSnap)生成和獲取
snapRoot=./www/snap/
#默認(rèn)截圖圖片,在啟動(dòng)FFmpeg截圖后但是截圖還未生成時(shí),可以返回默認(rèn)的預(yù)設(shè)圖片
defaultSnap=./www/logo.png
[ffmpeg]
#FFmpeg可執(zhí)行程序路徑,支持相對(duì)路徑/絕對(duì)路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通過(guò)該模板可以設(shè)置再編碼的一些參數(shù)
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的命令,可以通過(guò)修改該配置改變截圖分辨率或質(zhì)量
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
log=./ffmpeg/ffmpeg.log
# 自動(dòng)重啟的時(shí)間(秒), 默認(rèn)為0, 也就是不自動(dòng)重啟. 主要是為了避免長(zhǎng)時(shí)間ffmpeg拉流導(dǎo)致的不同步現(xiàn)象
restart_sec=0
#轉(zhuǎn)協(xié)議相關(guān)開關(guān);如果addStreamProxy api和on_publish hook回復(fù)未指定轉(zhuǎn)協(xié)議參數(shù),則采用這些配置項(xiàng)
[protocol]
#轉(zhuǎn)協(xié)議時(shí),是否開啟幀級(jí)時(shí)間戳覆蓋
modify_stamp=0
#轉(zhuǎn)協(xié)議是否開啟音頻
enable_audio=1
#添加acc靜音音頻,在關(guān)閉音頻時(shí),此開關(guān)無(wú)效
add_mute_audio=1
#推流斷開后可以在超時(shí)時(shí)間內(nèi)重新連接上繼續(xù)推流,這樣播放器會(huì)接著播放。
#置0關(guān)閉此特性(推流斷開會(huì)導(dǎo)致立即斷開播放器)
#此參數(shù)不應(yīng)大于播放器超時(shí)時(shí)間;單位毫秒
continue_push_ms=15000
#是否開啟轉(zhuǎn)換為hls
enable_hls=1
#是否開啟MP4錄制
enable_mp4=0
#是否開啟轉(zhuǎn)換為rtsp/webrtc
enable_rtsp=1
#是否開啟轉(zhuǎn)換為rtmp/flv
enable_rtmp=1
#是否開啟轉(zhuǎn)換為http-ts/ws-ts
enable_ts=1
#是否開啟轉(zhuǎn)換為http-fmp4/ws-fmp4
enable_fmp4=1
#是否將mp4錄制當(dāng)做觀看者
mp4_as_player=0
#mp4切片大小,單位秒
mp4_max_second=3600
#mp4錄制保存路徑
mp4_save_path=./www
#hls錄制保存路徑
hls_save_path=./www
###### 以下是按需轉(zhuǎn)協(xié)議的開關(guān),在測(cè)試ZLMediaKit的接收推流性能時(shí),請(qǐng)把下面開關(guān)置1
###### 如果某種協(xié)議你用不到,你可以把以下開關(guān)置1以便節(jié)省資源(但是還是可以播放,只是第一個(gè)播放者體驗(yàn)稍微差點(diǎn)),
###### 如果某種協(xié)議你想獲取最好的用戶體驗(yàn),請(qǐng)置0(第一個(gè)播放者可以秒開,且不花屏)
#hls協(xié)議是否按需生成,如果hls.segNum配置為0(意味著hls錄制),那么hls將一直生成(不管此開關(guān))
hls_demand=0
#rtsp[s]協(xié)議是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協(xié)議是否按需生成
rtmp_demand=0
#http[s]-ts協(xié)議是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協(xié)議是否按需生成
fmp4_demand=0
[general]
#是否啟用虛擬主機(jī)
enableVhost=0
#播放器或推流器在斷開后會(huì)觸發(fā)hook.on_flow_report**(使用多少流量**),
#flowThreshold參數(shù)控制觸發(fā)hook.on_flow_report**閾值,使用流量超過(guò)該閾值后才觸發(fā),單位KB
flowThreshold=1024
#播放最多等待時(shí)間,單位毫秒
#播放在播放某個(gè)流時(shí),如果該流不存在,
#ZLMediaKit會(huì)最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個(gè)時(shí)間內(nèi),該流注冊(cè)成功,那么會(huì)立即返回播放器播放成功
#否則返回播放器未找到該流,該機(jī)制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個(gè)流無(wú)人觀看時(shí),觸發(fā)hook.on_stream_none_reader**的最大等待時(shí)間,單位毫秒
#在配合hook.on_stream_none_reader**時(shí),可以做到無(wú)人觀看自動(dòng)停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流**時(shí)如果斷流再重連成功是否刪除前一次的媒體流數(shù)據(jù),如果刪除將重新開始,
#如果不刪除將會(huì)接著上一次的數(shù)據(jù)繼續(xù)寫(錄制hls/mp4時(shí)會(huì)繼續(xù)在前一個(gè)文件后面寫)
resetWhenRePlay=1
#合并寫緩存大小(單位毫秒),合并寫指服務(wù)器緩存一定的數(shù)據(jù)后才會(huì)一次性寫入socket,這樣能提高性能,但是會(huì)提高延時(shí)
#開啟后會(huì)同時(shí)關(guān)閉TCP_NODELAY并開啟MSG_MORE
mergeWriteMS=0
#服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,
#這里需要修改成自己定義的,your_server_id只是提示你是你自己服務(wù)器的id
#很多新手看都不看就原封不動(dòng)的使用
mediaServerId=your_server_id
#最多等待未初始化的Track時(shí)間,單位毫秒,超時(shí)之后會(huì)忽略未初始化的Track
wait_track_ready_ms=10000
#如果流只有單Track,最多等待若干毫秒,超時(shí)后未收到其他Track的數(shù)據(jù),則認(rèn)為是單Track
#如果協(xié)議元數(shù)據(jù)有聲明特定track數(shù),那么無(wú)此等待時(shí)間
wait_add_track_ms=3000
#如果track未就緒,我們先緩存幀數(shù)據(jù),但是有最大個(gè)數(shù)限制,防止內(nèi)存溢出
unready_frame_cache=100
[hls]
#hls寫文件的buf大小,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#hls最大切片時(shí)間
segDur=2
#m3u8索引中,hls保留切片個(gè)數(shù)(實(shí)際保留切片個(gè)數(shù)大2~3個(gè))
#如果設(shè)置為0,則不刪除切片,而是保存為點(diǎn)播
segNum=3
#HLS切片從m3u8文件中移除后,繼續(xù)保留在磁盤上的個(gè)數(shù)
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls文件刪除延時(shí),單位秒,issue: #913
deleteDelaySec=10
#是否保留hls文件,此功能部分等效于segNum=0的情況
#不同的是這個(gè)保留不會(huì)在m3u8文件中體現(xiàn)
#0為不保留,不起作用
#1為保留,則不刪除hls文件,如果開啟此功能,注意磁盤大小,或者定期手動(dòng)清理hls文件
segKeep=0
[hook]
#在推流時(shí),如果url參數(shù)匹對(duì)admin_params,那么可以不經(jīng)過(guò)hook鑒權(quán)直接推流成功,播放時(shí)亦然
#該配置項(xiàng)的目的是為了開發(fā)者自己調(diào)試測(cè)試,該參數(shù)暴露后會(huì)有泄露隱私的安全隱患
admin_params=secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#是否啟用hook**,啟用后,推拉流都將進(jìn)行鑒權(quán)
enable=0
#播放器或推流器使用流量**,置空則關(guān)閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#訪問(wèn)http文件鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權(quán)**,置空則關(guān)閉鑒權(quán)
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播放鑒權(quán)**,此**中比對(duì)rtsp的用戶名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權(quán)**,置空則關(guān)閉rtsp鑒權(quán)。rtsp播放鑒權(quán)還支持url方式鑒權(quán)
#建議開發(fā)者統(tǒng)一采用url參數(shù)方式鑒權(quán),rtsp用戶名密碼鑒權(quán)一般在設(shè)備上用的比較多
#開啟rtsp專屬鑒權(quán)后,將不再觸發(fā)on_play鑒權(quán)**
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠(yuǎn)程telnet調(diào)試鑒權(quán)**
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊(cè)或注銷**
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無(wú)人觀看流**,通過(guò)該**,可以選擇是否關(guān)閉無(wú)人觀看的流。配合general.streamNoneReaderDelayMS選項(xiàng)一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時(shí),未找到流**,通過(guò)配合hook.on_stream_none_reader**可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#服務(wù)器啟動(dòng)報(bào)告,可以用于服務(wù)器的崩潰重啟****
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server保活上報(bào)
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#發(fā)送rtp(startSendRtp)被動(dòng)關(guān)閉時(shí)回調(diào)
on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped
#rtp server 超時(shí)未收到數(shù)據(jù)
on_rtp_server_timeout=https://127.0.0.1/index/hook/on_rtp_server_timeout
#hook api最大等待回復(fù)時(shí)間,單位秒
timeoutSec=10
#keepalive hook觸發(fā)間隔,單位秒,float類型
alive_interval=10.0
#hook通知失敗重試次數(shù),正整數(shù)。為0不重試,1時(shí)重試一次,以此類推
retry=1
#hook通知失敗重試延時(shí),單位秒,float型
retry_delay=3.0
[cluster]
#設(shè)置源站拉流url模板, 格式跟printf類似,第一個(gè)%s指定app,第二個(gè)%s指定stream_id,
#開啟集群模式后,on_stream_not_found和on_stream_none_reader hook將無(wú)效.
#溯源模式支持以下類型:
#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
#支持多個(gè)源站,不同源站通過(guò)分號(hào)(;)分隔
origin_url=
#溯源總超時(shí)時(shí)長(zhǎng),單位秒,float型;假如源站有3個(gè),那么單次溯源超時(shí)時(shí)間為timeout_sec除以3
#單次溯源超時(shí)時(shí)間不要超過(guò)general.maxStreamWaitMS配置
timeout_sec=15
#溯源失敗嘗試次數(shù),-1時(shí)**嘗試
retry_count=3
[http]
#http服務(wù)器字符編碼,windows上默認(rèn)gb2312
charSet=utf-8
#http鏈接超時(shí)時(shí)間
keepAliveSecond=30
#http請(qǐng)求體最大字節(jié)數(shù),如果post的body太大,則不適合緩存body在內(nèi)存
maxReqSize=40960
#404網(wǎng)頁(yè)內(nèi)容,用戶可以自定義404網(wǎng)頁(yè)
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您訪問(wèn)的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服務(wù)器**端口
port=80
#http文件服務(wù)器根目錄
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
rootPath=./www
#http文件服務(wù)器讀文件緩存大小,單位BYTE,調(diào)整該參數(shù)可以優(yōu)化文件io性能
sendBufSize=65536
#https服務(wù)器**端口
sslport=443
#是否顯示文件夾菜單,開啟后可以瀏覽文件夾
dirMenu=1
#虛擬目錄, 虛擬目錄名和文件路徑使用","隔開,多個(gè)配置路徑間用";"隔開
#例如賦值為 app_a,/path/to/a;app_b,/path/to/b 那么
#訪問(wèn) http://127.0.0.1/app_a/file_a 對(duì)應(yīng)的文件路徑為 /path/to/a/file_a
#訪問(wèn) http://127.0.0.1/app_b/file_b 對(duì)應(yīng)的文件路徑為 /path/to/b/file_b
#訪問(wèn)其他http路徑,對(duì)應(yīng)的文件路徑還是在rootPath內(nèi)
virtualPath=
#禁止后綴的文件使用mmap緩存,使用“,”隔開
#例如賦值為 .mp4,.flv
#那么訪問(wèn)后綴為.mp4與.flv 的文件不緩存
forbidCacheSuffix=
#可以把http**前真實(shí)客戶端ip放在http頭中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否則可能導(dǎo)致偽造客戶端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點(diǎn)播的應(yīng)用名,通過(guò)限制應(yīng)用名,可以防止隨意點(diǎn)播
#點(diǎn)播的文件必須放置在此文件夾下
appName=record
#mp4錄制寫文件緩存,單位BYTE,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#mp4點(diǎn)播每次流化數(shù)據(jù)量,單位毫秒,
#減少該值可以讓點(diǎn)播數(shù)據(jù)發(fā)送量更平滑,增大該值則更節(jié)省cpu資源
sampleMS=500
#mp4錄制完成后是否進(jìn)行二次關(guān)鍵幀索引寫入頭部
fastStart=0
#MP4點(diǎn)播(rtsp/rtmp/http-flv/ws-flv)是否循環(huán)播放文件
fileRepeat=0
[rtmp]
#rtmp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtmp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#在接收rtmp推流時(shí),是否重新生成時(shí)間戳(很多推流器的時(shí)間戳著實(shí)很爛)
modifyStamp=0
#rtmp服務(wù)器**端口
port=1935
#rtmps服務(wù)器**地址
sslport=0
[rtp]
#音頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
#加大該值會(huì)明顯增加直播延時(shí)
audioMtuSize=600
#視頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
videoMtuSize=1400
#rtp包最大長(zhǎng)度限制,單位KB,主要用于識(shí)別TCP上下文破壞時(shí),獲取到錯(cuò)誤的rtp
rtpMaxSize=10
# rtp 打包時(shí),低延遲開關(guān),默認(rèn)關(guān)閉(為0),h264存在一幀多個(gè)slice(NAL)的情況,在這種情況下,如果開啟可能會(huì)導(dǎo)致畫面花屏
lowLatency=0
[rtp_proxy]
#導(dǎo)出調(diào)試數(shù)據(jù)(包括rtp/ps/h264)至該目錄,置空則關(guān)閉數(shù)據(jù)導(dǎo)出
dumpDir=
#udp和tcp**服務(wù)器,支持rtp(必須是ts或ps類型)**
port=10000
#rtp超時(shí)時(shí)間,單位秒
timeoutSec=15
#隨機(jī)端口范圍,最少確保36個(gè)端口
#該范圍同時(shí)限制rtsp服務(wù)器udp端口范圍
port_range=30000-35000
#rtp h264 負(fù)載的pt
h264_pt=98
#rtp h265 負(fù)載的pt
h265_pt=99
#rtp ps 負(fù)載的pt
ps_pt=96
#rtp opus 負(fù)載的pt
opus_pt=100
[rtc]
#rtc播放推流、播放超時(shí)時(shí)間
timeoutSec=15
#本機(jī)對(duì)rtc客戶端的可見ip,作為服務(wù)器時(shí)一般為公網(wǎng)ip,可有多個(gè),用','分開,當(dāng)置空時(shí),會(huì)自動(dòng)獲取網(wǎng)卡ip
#同時(shí)支持環(huán)境變量,以$開頭,如"$EXTERN_IP"; 請(qǐng)參考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服務(wù)器**端口號(hào),所有rtc客戶端將通過(guò)該端口傳輸stun/dtls/srtp/srtcp數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
port=8000
#rtc tcp服務(wù)器**端口號(hào),在udp 不通的情況下,會(huì)使用tcp傳輸數(shù)據(jù)
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
tcpPort = 8000
#設(shè)置remb比特率,非0時(shí)關(guān)閉twcc并開啟remb。該設(shè)置在rtc推流時(shí)有效,可以控制推流畫質(zhì)
#目前已經(jīng)實(shí)現(xiàn)twcc自動(dòng)調(diào)整碼率,關(guān)閉remb根據(jù)真實(shí)網(wǎng)絡(luò)狀況調(diào)整碼率
rembBitRate=0
#rtc支持的音頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的音頻codec
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
#rtc支持的視頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的視頻codec
preferredCodecV=H264,H265,AV1,VP9,VP8
[srt]
#srt播放推流、播放超時(shí)時(shí)間,單位秒
timeoutSec=5
#srt udp服務(wù)器**端口號(hào),所有srt客戶端將通過(guò)該端口傳輸srt數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
port=9000
#srt 協(xié)議中延遲緩存的估算參數(shù),在握手階段估算rtt ,第二latencyMul*rtt 為最大緩存時(shí)長(zhǎng),此參數(shù)越大,表示等待重傳的時(shí)長(zhǎng)就越大
latencyMul=4
#包緩存的大小
pktBufSize=8192
[rtsp]
#rtsp專有鑒權(quán)方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流**是否是直接**模式
#直接**后支持任意編碼格式,但是會(huì)導(dǎo)致GOP緩存無(wú)法**到I幀,可能會(huì)導(dǎo)致開播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu會(huì)導(dǎo)致無(wú)法使用udp方式**
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接**的方式來(lái)支持rtsp**
#如果你是rtsp推拉流,但是webrtc播放,也建議關(guān)閉直接**模式,
#因?yàn)橹苯?*時(shí),rtp中可能沒(méi)有sps pps,會(huì)導(dǎo)致webrtc無(wú)法播放; 另外webrtc也不支持Single NAL Unit Packets類型rtp
#默認(rèn)開啟rtsp直接**,rtmp由于沒(méi)有這些問(wèn)題,是強(qiáng)制開啟直接**的
directProxy=1
#rtsp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtsp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#rtsp服務(wù)器**地址
port=554
#rtsps服務(wù)器**地址
sslport=0
#rtsp 轉(zhuǎn)發(fā)是否使用低延遲模式,當(dāng)開啟時(shí),不會(huì)緩存rtp包,來(lái)提高并發(fā),可以降低一幀的延遲
lowLatency=0
[shell]
#調(diào)試telnet服務(wù)器接受最**ufffer大小
maxReqSize=1024
#調(diào)試telnet服務(wù)器**端口
port=0
(10)點(diǎn)擊MediaServer.exe啟動(dòng)zlm,出現(xiàn)如下界面,說(shuō)明啟動(dòng)成功。
4.運(yùn)行前端程序
(1)編譯程序
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
(2)運(yùn)行程序
# 本地運(yùn)行命令
npm run dev
出現(xiàn)這樣的提示說(shuō)明運(yùn)行成功
(3)出現(xiàn)上圖的提示說(shuō)明成功,在瀏覽器輸入http://127.0.0.1:8082,即可訪問(wèn)前端頁(yè)面
用戶登錄
(4)主頁(yè)看板展示
主頁(yè)看板
三、設(shè)備接入
(1)這里我們以大華攝像頭為例
攝像頭配置界面
(2)編輯好相應(yīng)參數(shù)后,點(diǎn)擊確定即可注冊(cè)到平臺(tái)。
設(shè)備注冊(cè)上平臺(tái)
(3)點(diǎn)播設(shè)備,測(cè)試是否正常拉流
通道信息
實(shí)際拉流效果
到這里zlm+wvp流媒體平臺(tái)搭建教程就結(jié)束了,對(duì)于新手的開發(fā)者,可以讓他們少走不少?gòu)澛?,好將更多的時(shí)間用在二次開發(fā)和產(chǎn)品打磨上。本文不足和沒(méi)有涉及到的地方,歡迎留言指正!
最后附上我在此框架上二次開發(fā)的項(xiàng)目截圖,目前已經(jīng)運(yùn)用在實(shí)際項(xiàng)目中,有相關(guān)經(jīng)驗(yàn)開發(fā)者的可以留言交流。
首頁(yè)看板
視頻**
系統(tǒng)運(yùn)行情況
ps:最后感謝zlm框架和wvp框架作者,提供這么好的開源框架~
拓展知識(shí):
前沿拓展:
win7 **r
32位基本兼容所有的軟件了。
不過(guò)你說(shuō)的這個(gè)不清楚
我現(xiàn)在就在用win7,感覺很不錯(cuò),沒(méi)出現(xiàn)過(guò)不兼容的情況
在流媒體日趨成熟的今天,大家每天都會(huì)刷大量視頻,又或者擁有一部手機(jī)就能遠(yuǎn)程查看家里的**;那作為新手的你,怎么從無(wú)到有打造自己的流媒體平臺(tái)呢?
這里我們選用wvp+ZLMediaKit開源平臺(tái),WEB VIDEO PLATFORM(wvp)是一個(gè)基于GB28181-2016標(biāo)準(zhǔn)實(shí)現(xiàn)的網(wǎng)絡(luò)視頻平臺(tái),支持NAT穿透,支持海康、大華、宇視等品牌的IPC、NVR、**R接入。支持國(guó)標(biāo)級(jí)聯(lián),支持rtsp/rtmp等視頻流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái),支持rtsp/rtmp等推流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái)。
一、準(zhǔn)備工作
1.安裝所需工具
maven(管理java代碼依賴)、ffmpeg、nodejs(版本根據(jù)自己項(xiàng)目的需要安裝,我本人安裝的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根據(jù)個(gè)人情況下載不同版本,本人使用的是2017,windows最好也用這個(gè)版本)、Cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue編輯器可自行選擇,我使用的是HBuilder X。
2.從github克隆zlm代碼
# 國(guó)內(nèi)用戶推薦從同步鏡像網(wǎng)站gitee下載
git clone –depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千萬(wàn)不要忘記執(zhí)行這句命令
git submodule update –init
3.同理克隆wvp代碼
git clone https://github.com/648540858/wvp-GB28181-pro.git
二、開始編譯工作
1.編譯前端代碼
前端代碼采用的是vue+element編寫,所以你如果想要深入學(xué)習(xí),可以相應(yīng)的去熟悉一下vue的語(yǔ)法和element的組件用法。
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
# 安裝依賴命令
npm –registry=https://registry.npm.taobao.org install
# 打包命令
npm run build
# 本地運(yùn)行命令
npm run dev
# 當(dāng)然,如果你喜歡用yarn,這里也可以換成yarn命令去**作,具體實(shí)現(xiàn)可以自行研究一下
2.編譯wvp
在編譯之前,我們需要對(duì)配置文件進(jìn)行配置,項(xiàng)目目錄如下所示:
項(xiàng)目文件目錄預(yù)覽
該項(xiàng)目數(shù)據(jù)庫(kù)在sql文件夾里,點(diǎn)擊打開之后就會(huì)看到一個(gè)sql文件。
數(shù)據(jù)庫(kù)文件
開發(fā)者可以自行導(dǎo)入數(shù)據(jù)庫(kù)里。隨著wvp版本更新,數(shù)據(jù)庫(kù)可能會(huì)有差異,具體以實(shí)際文件為準(zhǔn)。
數(shù)據(jù)庫(kù)表預(yù)覽(具體以新版本數(shù)據(jù)庫(kù)為準(zhǔn))
項(xiàng)目配置文件位于srcmainresources目錄下,如果開發(fā)者采用打包即用,不用指定配置文件的情況下,可以修改application-local.yml,如果指定其他配置文件,可以在application.yml里修改。
配置文件路徑預(yù)覽
注意,以下配置的**作都是在application-local.yml配置文件里完成。
(1)配置數(shù)據(jù)庫(kù)
spring:
devtools:
restart:
additional-paths: src/main/java
thymeleaf:
cache: false
# REDIS數(shù)據(jù)庫(kù)配置
redis:
# [必須修改] Redis服務(wù)器IP, REDIS安裝在本機(jī)的,使用127.0.0.1
host: 127.0.0.1
# [必須修改] 端口號(hào)
port: 6379
# [可選] 數(shù)據(jù)庫(kù) DB
database: 6
# [可選] 訪問(wèn)密碼,若你的redis服務(wù)器沒(méi)有設(shè)置密碼,就不需要用密碼去連接
password:
# [可選] 超時(shí)時(shí)間
timeout: 10000
# [可選] jdbc數(shù)據(jù)庫(kù)配置, 項(xiàng)目使用sqlite作為數(shù)據(jù)庫(kù),一般不需要配置
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服務(wù)器啟動(dòng)端口
# [可選] WVP**的HTTP端口, 網(wǎng)頁(yè)和接口調(diào)用都是這個(gè)端口
server:
port: 18080
(3)28181服務(wù)配置
# 作為28181服務(wù)器的配置
sip:
# [必須修改] 本機(jī)的IP,這里是我本地ip
ip: 10.10.10.110
# [可選] 28181服務(wù)**的端口
port: 6060
# 根據(jù)國(guó)標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國(guó)標(biāo)附錄D中定義前8位為中心編碼(由省級(jí)、市級(jí)、區(qū)級(jí)、基層編號(hào)組成,參照GB/T 2260-2007)
# 后兩位為行業(yè)編碼,定義參照附錄D.3
# 3701020049標(biāo)識(shí)山東濟(jì)南歷下區(qū) 信息行業(yè)接入
# [可選]
domain: 4401020049
# [可選]
id: 44010200492000000001
# [可選] 默認(rèn)設(shè)備認(rèn)證密碼,移除密碼將不進(jìn)行校驗(yàn)
password: 1234567890
(4)zlm默認(rèn)服務(wù)器配置(wvp啟動(dòng)的時(shí)候會(huì)去尋找默認(rèn)的zlm服務(wù)器)
#zlm 默認(rèn)服務(wù)器配置
media:
# [必須修改] zlm服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,general.mediaServerId
id:
# [必須修改] zlm服務(wù)器的內(nèi)網(wǎng)IP
ip: 10.10.10.110
# [可選] 返回流地址時(shí)的ip,置空使用 media.ip
stream-ip:
# [可選] wvp在國(guó)標(biāo)信令中使用的ip,此ip為**可以訪問(wèn)到的ip, 置空使用 media.ip
sdp-ip:
# [可選] zlm服務(wù)器的hook所使用的IP, 默認(rèn)使用sip.ip
hook-ip:
# [必須修改] zlm服務(wù)器的http.port
http-port: 80
# [可選] zlm服務(wù)器的http.sslport, 置空使用zlm配置文件配置
http-ssl-port:
# [可選] zlm服務(wù)器的rtmp.port, 置空使用zlm配置文件配置
rtmp-port:
# [可選] zlm服務(wù)器的rtmp.sslport, 置空使用zlm配置文件配置
rtmp-ssl-port:
# [可選] zlm服務(wù)器的 rtp_proxy.port, 置空使用zlm配置文件配置
rtp-proxy-port:
# [可選] zlm服務(wù)器的 rtsp.port, 置空使用zlm配置文件配置
rtsp-port:
# [可選] zlm服務(wù)器的 rtsp.sslport, 置空使用zlm配置文件配置
rtsp-ssl-port:
# [可選] 是否自動(dòng)配置ZLM, 如果希望手動(dòng)配置ZLM, 可以設(shè)為false, 不建議新接觸的用戶修改
auto-config: true
# [可選] zlm服務(wù)器的hook.admin_params=secret
secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc
# 啟用多端口模式, 多端口模式使用端口區(qū)分每路流,兼容性更好。 單端口使用流的ssrc區(qū)分, 點(diǎn)播超時(shí)建議使用多端口測(cè)試
rtp:
# [可選] 是否啟用多端口模式, 開啟后會(huì)在portRange范圍內(nèi)選擇端口用于媒體流傳輸
enable: true
# [可選] 在此范圍內(nèi)選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動(dòng)配置此屬性可能不成功
port-range: 30000,30500 # 端口范圍
# 錄像輔助服務(wù), 部署此服務(wù)可以實(shí)現(xiàn)zlm錄像的管理與下載, 0 表示不使用
record-assist-port: 0
(5)其他配置(具體可根據(jù)業(yè)務(wù)自行調(diào)整)
# [根據(jù)業(yè)務(wù)需求配置]
user-settings:
# 推流直播是否錄制
record-push-live: true
auto-apply-play: false
# [可選] 部分設(shè)備需要擴(kuò)展SDP,需要打開此設(shè)置
senior-sdp: false
# 保存移動(dòng)位置歷史軌跡:true:保留歷史數(shù)據(jù),false:僅保留最后的位置(默認(rèn))
save-position-history: false
# 點(diǎn)播/錄像回放 等待超時(shí)時(shí)間,單位:毫秒
play-timeout: 18000
# 上級(jí)點(diǎn)播等待超時(shí)時(shí)間,單位:毫秒
platform-play-timeout: 60000
# 是否開啟接口鑒權(quán)
interface-authentication: true
# 接口鑒權(quán)例外的接口, 即不進(jìn)行接口鑒權(quán)的接口,盡量詳細(xì)書寫,盡量不用/**,至少兩級(jí)目錄
interface-authentication-excludes:
– /api/v1/**
# 國(guó)標(biāo)是否錄制
record-sip: true
# 是否將日志存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)
logInDatebase: true
# 使用推流狀態(tài)作為推流通道狀態(tài)
use-pushing-as-status: true
# 使用來(lái)源請(qǐng)求ip作為streamIp,當(dāng)且僅當(dāng)你只有zlm節(jié)點(diǎn)它與wvp在一起的情況下開啟
use-source-ip-as-stream-ip: true
# 國(guó)標(biāo)點(diǎn)播 按需拉流, true:有人觀看拉流,無(wú)人觀看釋放, false:拉起后不自動(dòng)釋放
stream-on-demand: true
# 推流鑒權(quán), 默認(rèn)開啟
push-authority: true
# 國(guó)標(biāo)級(jí)聯(lián)發(fā)流嚴(yán)格模式,嚴(yán)格模式會(huì)使用與sdp信息中一致的端口發(fā)流,端口共享media.rtp.port-range,這會(huì)損失一些性能,
# 非嚴(yán)格模式使用隨機(jī)端口發(fā)流,性能更好, 默認(rèn)關(guān)閉
gb-send-stream-strict: false
# 設(shè)備上線時(shí)是否自動(dòng)同步通道
sync-channel-on-device-online: false
# 是否使用設(shè)備來(lái)源Ip作為回復(fù)IP, 不設(shè)置則為 false
sip-use-source-ip-as-remote-address: false
# 是否開啟sip日志
sip-log: true
# 自動(dòng)數(shù)據(jù)庫(kù)升級(jí),保證表結(jié)構(gòu)完整
sync-db: false
(6)編譯wvp
啟動(dòng)IntelliJ IDEA,打開wvp項(xiàng)目,開始編譯??吹匠霈F(xiàn)這樣的界面,表明編譯并且運(yùn)行成功。
編譯wvp
3.編譯zlm
(1)打開安裝好的Cmake,選擇zlm項(xiàng)目所在位置,并且選擇你build項(xiàng)目時(shí)的位置,這里我們就放在同一目錄下,方便管理。
選擇項(xiàng)目目錄和build目錄
下一步,點(diǎn)擊Yes
(2)點(diǎn)擊Configure
(3)點(diǎn)擊Genrate,可以看到兩個(gè)步驟都提示成功了。
(4)選擇打開項(xiàng)目,就會(huì)自動(dòng)打開Visual Studio 2017
打開項(xiàng)目
(5)這里我們直接可以按下圖**作,你也可以選擇Release
選擇之后點(diǎn)擊本地Windows調(diào)試器
(6)這里編譯需要一定時(shí)間,耐心等待。
編譯成功
(7)出現(xiàn)編譯完成的提示后,去項(xiàng)目目錄下找到Debug目錄或者Release目錄。目錄位置位于release目錄下
zlm應(yīng)用程序入口目錄
最終應(yīng)用程序
(8)這里我們不能直接點(diǎn)擊MediaServer.exe,需要對(duì)其進(jìn)行配置,我們?cè)谏弦粋€(gè)目錄,會(huì)看到一個(gè)config.ini文件,打開并將它**到MediaServer.exe所在目錄。當(dāng)然,你也可以直接打開MediaServer.exe,第二它也會(huì)在當(dāng)前目錄自動(dòng)生成一個(gè)config.ini文件,你打開config.ini進(jìn)去配置即可。
配置文件示例
(9)zlm配置文件詳細(xì)配置如下,開發(fā)者可根據(jù)自己的實(shí)際情況調(diào)整
#!!!!此配置文件為范例配置文件,意在告訴讀者,各個(gè)配置項(xiàng)的具體含義和作用,
#!!!!該配置文件在執(zhí)行cmake時(shí),會(huì)拷貝至release/${**作系統(tǒng)類型}/${編譯類型}(例如release/linux/Debug) 文件夾。
#!!!!該文件夾(release/${**作系統(tǒng)類型}/${編譯類型})同時(shí)也是可執(zhí)行程序生成目標(biāo)路徑,在執(zhí)行MediaServer進(jìn)程時(shí),它會(huì)默認(rèn)加載同目錄下的config.ini文件作為配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不會(huì)被MediaServer進(jìn)程加載,因?yàn)镸ediaServer進(jìn)程默認(rèn)加載的是release/${**作系統(tǒng)類型}/${編譯類型}/config.ini。
#!!!!當(dāng)然,你每次執(zhí)行cmake,該文件確實(shí)會(huì)被拷貝至release/${**作系統(tǒng)類型}/${編譯類型}/config.ini,
#!!!!但是一般建議你直接修改release/${**作系統(tǒng)類型}/${編譯類型}/config.ini文件,修改此文件一般不起作用,除非你運(yùn)行MediaServer時(shí)使用-c參數(shù)指定到此文件。
[api]
#是否調(diào)試http api,啟用調(diào)試后,會(huì)打印每次http請(qǐng)求的內(nèi)容和回復(fù)
apiDebug=1
#一些比較敏感的http api在訪問(wèn)時(shí)需要提供secret,否則無(wú)權(quán)限調(diào)用
#如果是通過(guò)127.0.0.1訪問(wèn),那么可以不提供secret
secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#截圖保存路徑根目錄,截圖通過(guò)http api(/index/api/getSnap)生成和獲取
snapRoot=./www/snap/
#默認(rèn)截圖圖片,在啟動(dòng)FFmpeg截圖后但是截圖還未生成時(shí),可以返回默認(rèn)的預(yù)設(shè)圖片
defaultSnap=./www/logo.png
[ffmpeg]
#FFmpeg可執(zhí)行程序路徑,支持相對(duì)路徑/絕對(duì)路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通過(guò)該模板可以設(shè)置再編碼的一些參數(shù)
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的命令,可以通過(guò)修改該配置改變截圖分辨率或質(zhì)量
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
log=./ffmpeg/ffmpeg.log
# 自動(dòng)重啟的時(shí)間(秒), 默認(rèn)為0, 也就是不自動(dòng)重啟. 主要是為了避免長(zhǎng)時(shí)間ffmpeg拉流導(dǎo)致的不同步現(xiàn)象
restart_sec=0
#轉(zhuǎn)協(xié)議相關(guān)開關(guān);如果addStreamProxy api和on_publish hook回復(fù)未指定轉(zhuǎn)協(xié)議參數(shù),則采用這些配置項(xiàng)
[protocol]
#轉(zhuǎn)協(xié)議時(shí),是否開啟幀級(jí)時(shí)間戳覆蓋
modify_stamp=0
#轉(zhuǎn)協(xié)議是否開啟音頻
enable_audio=1
#添加acc靜音音頻,在關(guān)閉音頻時(shí),此開關(guān)無(wú)效
add_mute_audio=1
#推流斷開后可以在超時(shí)時(shí)間內(nèi)重新連接上繼續(xù)推流,這樣播放器會(huì)接著播放。
#置0關(guān)閉此特性(推流斷開會(huì)導(dǎo)致立即斷開播放器)
#此參數(shù)不應(yīng)大于播放器超時(shí)時(shí)間;單位毫秒
continue_push_ms=15000
#是否開啟轉(zhuǎn)換為hls
enable_hls=1
#是否開啟MP4錄制
enable_mp4=0
#是否開啟轉(zhuǎn)換為rtsp/webrtc
enable_rtsp=1
#是否開啟轉(zhuǎn)換為rtmp/flv
enable_rtmp=1
#是否開啟轉(zhuǎn)換為http-ts/ws-ts
enable_ts=1
#是否開啟轉(zhuǎn)換為http-fmp4/ws-fmp4
enable_fmp4=1
#是否將mp4錄制當(dāng)做觀看者
mp4_as_player=0
#mp4切片大小,單位秒
mp4_max_second=3600
#mp4錄制保存路徑
mp4_save_path=./www
#hls錄制保存路徑
hls_save_path=./www
###### 以下是按需轉(zhuǎn)協(xié)議的開關(guān),在測(cè)試ZLMediaKit的接收推流性能時(shí),請(qǐng)把下面開關(guān)置1
###### 如果某種協(xié)議你用不到,你可以把以下開關(guān)置1以便節(jié)省資源(但是還是可以播放,只是第一個(gè)播放者體驗(yàn)稍微差點(diǎn)),
###### 如果某種協(xié)議你想獲取最好的用戶體驗(yàn),請(qǐng)置0(第一個(gè)播放者可以秒開,且不花屏)
#hls協(xié)議是否按需生成,如果hls.segNum配置為0(意味著hls錄制),那么hls將一直生成(不管此開關(guān))
hls_demand=0
#rtsp[s]協(xié)議是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協(xié)議是否按需生成
rtmp_demand=0
#http[s]-ts協(xié)議是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協(xié)議是否按需生成
fmp4_demand=0
[general]
#是否啟用虛擬主機(jī)
enableVhost=0
#播放器或推流器在斷開后會(huì)觸發(fā)hook.on_flow_report**(使用多少流量**),
#flowThreshold參數(shù)控制觸發(fā)hook.on_flow_report**閾值,使用流量超過(guò)該閾值后才觸發(fā),單位KB
flowThreshold=1024
#播放最多等待時(shí)間,單位毫秒
#播放在播放某個(gè)流時(shí),如果該流不存在,
#ZLMediaKit會(huì)最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個(gè)時(shí)間內(nèi),該流注冊(cè)成功,那么會(huì)立即返回播放器播放成功
#否則返回播放器未找到該流,該機(jī)制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個(gè)流無(wú)人觀看時(shí),觸發(fā)hook.on_stream_none_reader**的最大等待時(shí)間,單位毫秒
#在配合hook.on_stream_none_reader**時(shí),可以做到無(wú)人觀看自動(dòng)停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流**時(shí)如果斷流再重連成功是否刪除前一次的媒體流數(shù)據(jù),如果刪除將重新開始,
#如果不刪除將會(huì)接著上一次的數(shù)據(jù)繼續(xù)寫(錄制hls/mp4時(shí)會(huì)繼續(xù)在前一個(gè)文件后面寫)
resetWhenRePlay=1
#合并寫緩存大小(單位毫秒),合并寫指服務(wù)器緩存一定的數(shù)據(jù)后才會(huì)一次性寫入socket,這樣能提高性能,但是會(huì)提高延時(shí)
#開啟后會(huì)同時(shí)關(guān)閉TCP_NODELAY并開啟MSG_MORE
mergeWriteMS=0
#服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,
#這里需要修改成自己定義的,your_server_id只是提示你是你自己服務(wù)器的id
#很多新手看都不看就原封不動(dòng)的使用
mediaServerId=your_server_id
#最多等待未初始化的Track時(shí)間,單位毫秒,超時(shí)之后會(huì)忽略未初始化的Track
wait_track_ready_ms=10000
#如果流只有單Track,最多等待若干毫秒,超時(shí)后未收到其他Track的數(shù)據(jù),則認(rèn)為是單Track
#如果協(xié)議元數(shù)據(jù)有聲明特定track數(shù),那么無(wú)此等待時(shí)間
wait_add_track_ms=3000
#如果track未就緒,我們先緩存幀數(shù)據(jù),但是有最大個(gè)數(shù)限制,防止內(nèi)存溢出
unready_frame_cache=100
[hls]
#hls寫文件的buf大小,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#hls最大切片時(shí)間
segDur=2
#m3u8索引中,hls保留切片個(gè)數(shù)(實(shí)際保留切片個(gè)數(shù)大2~3個(gè))
#如果設(shè)置為0,則不刪除切片,而是保存為點(diǎn)播
segNum=3
#HLS切片從m3u8文件中移除后,繼續(xù)保留在磁盤上的個(gè)數(shù)
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls文件刪除延時(shí),單位秒,issue: #913
deleteDelaySec=10
#是否保留hls文件,此功能部分等效于segNum=0的情況
#不同的是這個(gè)保留不會(huì)在m3u8文件中體現(xiàn)
#0為不保留,不起作用
#1為保留,則不刪除hls文件,如果開啟此功能,注意磁盤大小,或者定期手動(dòng)清理hls文件
segKeep=0
[hook]
#在推流時(shí),如果url參數(shù)匹對(duì)admin_params,那么可以不經(jīng)過(guò)hook鑒權(quán)直接推流成功,播放時(shí)亦然
#該配置項(xiàng)的目的是為了開發(fā)者自己調(diào)試測(cè)試,該參數(shù)暴露后會(huì)有泄露隱私的安全隱患
admin_params=secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#是否啟用hook**,啟用后,推拉流都將進(jìn)行鑒權(quán)
enable=0
#播放器或推流器使用流量**,置空則關(guān)閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#訪問(wèn)http文件鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權(quán)**,置空則關(guān)閉鑒權(quán)
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播放鑒權(quán)**,此**中比對(duì)rtsp的用戶名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權(quán)**,置空則關(guān)閉rtsp鑒權(quán)。rtsp播放鑒權(quán)還支持url方式鑒權(quán)
#建議開發(fā)者統(tǒng)一采用url參數(shù)方式鑒權(quán),rtsp用戶名密碼鑒權(quán)一般在設(shè)備上用的比較多
#開啟rtsp專屬鑒權(quán)后,將不再觸發(fā)on_play鑒權(quán)**
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠(yuǎn)程telnet調(diào)試鑒權(quán)**
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊(cè)或注銷**
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無(wú)人觀看流**,通過(guò)該**,可以選擇是否關(guān)閉無(wú)人觀看的流。配合general.streamNoneReaderDelayMS選項(xiàng)一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時(shí),未找到流**,通過(guò)配合hook.on_stream_none_reader**可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#服務(wù)器啟動(dòng)報(bào)告,可以用于服務(wù)器的崩潰重啟****
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server?;钌蠄?bào)
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#發(fā)送rtp(startSendRtp)被動(dòng)關(guān)閉時(shí)回調(diào)
on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped
#rtp server 超時(shí)未收到數(shù)據(jù)
on_rtp_server_timeout=https://127.0.0.1/index/hook/on_rtp_server_timeout
#hook api最大等待回復(fù)時(shí)間,單位秒
timeoutSec=10
#keepalive hook觸發(fā)間隔,單位秒,float類型
alive_interval=10.0
#hook通知失敗重試次數(shù),正整數(shù)。為0不重試,1時(shí)重試一次,以此類推
retry=1
#hook通知失敗重試延時(shí),單位秒,float型
retry_delay=3.0
[cluster]
#設(shè)置源站拉流url模板, 格式跟printf類似,第一個(gè)%s指定app,第二個(gè)%s指定stream_id,
#開啟集群模式后,on_stream_not_found和on_stream_none_reader hook將無(wú)效.
#溯源模式支持以下類型:
#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
#支持多個(gè)源站,不同源站通過(guò)分號(hào)(;)分隔
origin_url=
#溯源總超時(shí)時(shí)長(zhǎng),單位秒,float型;假如源站有3個(gè),那么單次溯源超時(shí)時(shí)間為timeout_sec除以3
#單次溯源超時(shí)時(shí)間不要超過(guò)general.maxStreamWaitMS配置
timeout_sec=15
#溯源失敗嘗試次數(shù),-1時(shí)**嘗試
retry_count=3
[http]
#http服務(wù)器字符編碼,windows上默認(rèn)gb2312
charSet=utf-8
#http鏈接超時(shí)時(shí)間
keepAliveSecond=30
#http請(qǐng)求體最大字節(jié)數(shù),如果post的body太大,則不適合緩存body在內(nèi)存
maxReqSize=40960
#404網(wǎng)頁(yè)內(nèi)容,用戶可以自定義404網(wǎng)頁(yè)
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您訪問(wèn)的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服務(wù)器**端口
port=80
#http文件服務(wù)器根目錄
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
rootPath=./www
#http文件服務(wù)器讀文件緩存大小,單位BYTE,調(diào)整該參數(shù)可以優(yōu)化文件io性能
sendBufSize=65536
#https服務(wù)器**端口
sslport=443
#是否顯示文件夾菜單,開啟后可以瀏覽文件夾
dirMenu=1
#虛擬目錄, 虛擬目錄名和文件路徑使用","隔開,多個(gè)配置路徑間用";"隔開
#例如賦值為 app_a,/path/to/a;app_b,/path/to/b 那么
#訪問(wèn) http://127.0.0.1/app_a/file_a 對(duì)應(yīng)的文件路徑為 /path/to/a/file_a
#訪問(wèn) http://127.0.0.1/app_b/file_b 對(duì)應(yīng)的文件路徑為 /path/to/b/file_b
#訪問(wèn)其他http路徑,對(duì)應(yīng)的文件路徑還是在rootPath內(nèi)
virtualPath=
#禁止后綴的文件使用mmap緩存,使用“,”隔開
#例如賦值為 .mp4,.flv
#那么訪問(wèn)后綴為.mp4與.flv 的文件不緩存
forbidCacheSuffix=
#可以把http**前真實(shí)客戶端ip放在http頭中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否則可能導(dǎo)致偽造客戶端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點(diǎn)播的應(yīng)用名,通過(guò)限制應(yīng)用名,可以防止隨意點(diǎn)播
#點(diǎn)播的文件必須放置在此文件夾下
appName=record
#mp4錄制寫文件緩存,單位BYTE,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#mp4點(diǎn)播每次流化數(shù)據(jù)量,單位毫秒,
#減少該值可以讓點(diǎn)播數(shù)據(jù)發(fā)送量更平滑,增大該值則更節(jié)省cpu資源
sampleMS=500
#mp4錄制完成后是否進(jìn)行二次關(guān)鍵幀索引寫入頭部
fastStart=0
#MP4點(diǎn)播(rtsp/rtmp/http-flv/ws-flv)是否循環(huán)播放文件
fileRepeat=0
[rtmp]
#rtmp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtmp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#在接收rtmp推流時(shí),是否重新生成時(shí)間戳(很多推流器的時(shí)間戳著實(shí)很爛)
modifyStamp=0
#rtmp服務(wù)器**端口
port=1935
#rtmps服務(wù)器**地址
sslport=0
[rtp]
#音頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
#加大該值會(huì)明顯增加直播延時(shí)
audioMtuSize=600
#視頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
videoMtuSize=1400
#rtp包最大長(zhǎng)度限制,單位KB,主要用于識(shí)別TCP上下文破壞時(shí),獲取到錯(cuò)誤的rtp
rtpMaxSize=10
# rtp 打包時(shí),低延遲開關(guān),默認(rèn)關(guān)閉(為0),h264存在一幀多個(gè)slice(NAL)的情況,在這種情況下,如果開啟可能會(huì)導(dǎo)致畫面花屏
lowLatency=0
[rtp_proxy]
#導(dǎo)出調(diào)試數(shù)據(jù)(包括rtp/ps/h264)至該目錄,置空則關(guān)閉數(shù)據(jù)導(dǎo)出
dumpDir=
#udp和tcp**服務(wù)器,支持rtp(必須是ts或ps類型)**
port=10000
#rtp超時(shí)時(shí)間,單位秒
timeoutSec=15
#隨機(jī)端口范圍,最少確保36個(gè)端口
#該范圍同時(shí)限制rtsp服務(wù)器udp端口范圍
port_range=30000-35000
#rtp h264 負(fù)載的pt
h264_pt=98
#rtp h265 負(fù)載的pt
h265_pt=99
#rtp ps 負(fù)載的pt
ps_pt=96
#rtp opus 負(fù)載的pt
opus_pt=100
[rtc]
#rtc播放推流、播放超時(shí)時(shí)間
timeoutSec=15
#本機(jī)對(duì)rtc客戶端的可見ip,作為服務(wù)器時(shí)一般為公網(wǎng)ip,可有多個(gè),用','分開,當(dāng)置空時(shí),會(huì)自動(dòng)獲取網(wǎng)卡ip
#同時(shí)支持環(huán)境變量,以$開頭,如"$EXTERN_IP"; 請(qǐng)參考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服務(wù)器**端口號(hào),所有rtc客戶端將通過(guò)該端口傳輸stun/dtls/srtp/srtcp數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
port=8000
#rtc tcp服務(wù)器**端口號(hào),在udp 不通的情況下,會(huì)使用tcp傳輸數(shù)據(jù)
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
tcpPort = 8000
#設(shè)置remb比特率,非0時(shí)關(guān)閉twcc并開啟remb。該設(shè)置在rtc推流時(shí)有效,可以控制推流畫質(zhì)
#目前已經(jīng)實(shí)現(xiàn)twcc自動(dòng)調(diào)整碼率,關(guān)閉remb根據(jù)真實(shí)網(wǎng)絡(luò)狀況調(diào)整碼率
rembBitRate=0
#rtc支持的音頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的音頻codec
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
#rtc支持的視頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的視頻codec
preferredCodecV=H264,H265,AV1,VP9,VP8
[srt]
#srt播放推流、播放超時(shí)時(shí)間,單位秒
timeoutSec=5
#srt udp服務(wù)器**端口號(hào),所有srt客戶端將通過(guò)該端口傳輸srt數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
port=9000
#srt 協(xié)議中延遲緩存的估算參數(shù),在握手階段估算rtt ,第二latencyMul*rtt 為最大緩存時(shí)長(zhǎng),此參數(shù)越大,表示等待重傳的時(shí)長(zhǎng)就越大
latencyMul=4
#包緩存的大小
pktBufSize=8192
[rtsp]
#rtsp專有鑒權(quán)方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流**是否是直接**模式
#直接**后支持任意編碼格式,但是會(huì)導(dǎo)致GOP緩存無(wú)法**到I幀,可能會(huì)導(dǎo)致開播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu會(huì)導(dǎo)致無(wú)法使用udp方式**
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接**的方式來(lái)支持rtsp**
#如果你是rtsp推拉流,但是webrtc播放,也建議關(guān)閉直接**模式,
#因?yàn)橹苯?*時(shí),rtp中可能沒(méi)有sps pps,會(huì)導(dǎo)致webrtc無(wú)法播放; 另外webrtc也不支持Single NAL Unit Packets類型rtp
#默認(rèn)開啟rtsp直接**,rtmp由于沒(méi)有這些問(wèn)題,是強(qiáng)制開啟直接**的
directProxy=1
#rtsp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtsp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#rtsp服務(wù)器**地址
port=554
#rtsps服務(wù)器**地址
sslport=0
#rtsp 轉(zhuǎn)發(fā)是否使用低延遲模式,當(dāng)開啟時(shí),不會(huì)緩存rtp包,來(lái)提高并發(fā),可以降低一幀的延遲
lowLatency=0
[shell]
#調(diào)試telnet服務(wù)器接受最**ufffer大小
maxReqSize=1024
#調(diào)試telnet服務(wù)器**端口
port=0
(10)點(diǎn)擊MediaServer.exe啟動(dòng)zlm,出現(xiàn)如下界面,說(shuō)明啟動(dòng)成功。
4.運(yùn)行前端程序
(1)編譯程序
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
(2)運(yùn)行程序
# 本地運(yùn)行命令
npm run dev
出現(xiàn)這樣的提示說(shuō)明運(yùn)行成功
(3)出現(xiàn)上圖的提示說(shuō)明成功,在瀏覽器輸入http://127.0.0.1:8082,即可訪問(wèn)前端頁(yè)面
用戶登錄
(4)主頁(yè)看板展示
主頁(yè)看板
三、設(shè)備接入
(1)這里我們以大華攝像頭為例
攝像頭配置界面
(2)編輯好相應(yīng)參數(shù)后,點(diǎn)擊確定即可注冊(cè)到平臺(tái)。
設(shè)備注冊(cè)上平臺(tái)
(3)點(diǎn)播設(shè)備,測(cè)試是否正常拉流
通道信息
實(shí)際拉流效果
到這里zlm+wvp流媒體平臺(tái)搭建教程就結(jié)束了,對(duì)于新手的開發(fā)者,可以讓他們少走不少?gòu)澛?,好將更多的時(shí)間用在二次開發(fā)和產(chǎn)品打磨上。本文不足和沒(méi)有涉及到的地方,歡迎留言指正!
最后附上我在此框架上二次開發(fā)的項(xiàng)目截圖,目前已經(jīng)運(yùn)用在實(shí)際項(xiàng)目中,有相關(guān)經(jīng)驗(yàn)開發(fā)者的可以留言交流。
首頁(yè)看板
視頻**
系統(tǒng)運(yùn)行情況
ps:最后感謝zlm框架和wvp框架作者,提供這么好的開源框架~
拓展知識(shí):
前沿拓展:
win7 **r
32位基本兼容所有的軟件了。
不過(guò)你說(shuō)的這個(gè)不清楚
我現(xiàn)在就在用win7,感覺很不錯(cuò),沒(méi)出現(xiàn)過(guò)不兼容的情況
在流媒體日趨成熟的今天,大家每天都會(huì)刷大量視頻,又或者擁有一部手機(jī)就能遠(yuǎn)程查看家里的**;那作為新手的你,怎么從無(wú)到有打造自己的流媒體平臺(tái)呢?
這里我們選用wvp+ZLMediaKit開源平臺(tái),WEB VIDEO PLATFORM(wvp)是一個(gè)基于GB28181-2016標(biāo)準(zhǔn)實(shí)現(xiàn)的網(wǎng)絡(luò)視頻平臺(tái),支持NAT穿透,支持海康、大華、宇視等品牌的IPC、NVR、**R接入。支持國(guó)標(biāo)級(jí)聯(lián),支持rtsp/rtmp等視頻流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái),支持rtsp/rtmp等推流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái)。
一、準(zhǔn)備工作
1.安裝所需工具
maven(管理java代碼依賴)、ffmpeg、nodejs(版本根據(jù)自己項(xiàng)目的需要安裝,我本人安裝的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根據(jù)個(gè)人情況下載不同版本,本人使用的是2017,windows最好也用這個(gè)版本)、Cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue編輯器可自行選擇,我使用的是HBuilder X。
2.從github克隆zlm代碼
# 國(guó)內(nèi)用戶推薦從同步鏡像網(wǎng)站gitee下載
git clone –depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千萬(wàn)不要忘記執(zhí)行這句命令
git submodule update –init
3.同理克隆wvp代碼
git clone https://github.com/648540858/wvp-GB28181-pro.git
二、開始編譯工作
1.編譯前端代碼
前端代碼采用的是vue+element編寫,所以你如果想要深入學(xué)習(xí),可以相應(yīng)的去熟悉一下vue的語(yǔ)法和element的組件用法。
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
# 安裝依賴命令
npm –registry=https://registry.npm.taobao.org install
# 打包命令
npm run build
# 本地運(yùn)行命令
npm run dev
# 當(dāng)然,如果你喜歡用yarn,這里也可以換成yarn命令去**作,具體實(shí)現(xiàn)可以自行研究一下
2.編譯wvp
在編譯之前,我們需要對(duì)配置文件進(jìn)行配置,項(xiàng)目目錄如下所示:
項(xiàng)目文件目錄預(yù)覽
該項(xiàng)目數(shù)據(jù)庫(kù)在sql文件夾里,點(diǎn)擊打開之后就會(huì)看到一個(gè)sql文件。
數(shù)據(jù)庫(kù)文件
開發(fā)者可以自行導(dǎo)入數(shù)據(jù)庫(kù)里。隨著wvp版本更新,數(shù)據(jù)庫(kù)可能會(huì)有差異,具體以實(shí)際文件為準(zhǔn)。
數(shù)據(jù)庫(kù)表預(yù)覽(具體以新版本數(shù)據(jù)庫(kù)為準(zhǔn))
項(xiàng)目配置文件位于srcmainresources目錄下,如果開發(fā)者采用打包即用,不用指定配置文件的情況下,可以修改application-local.yml,如果指定其他配置文件,可以在application.yml里修改。
配置文件路徑預(yù)覽
注意,以下配置的**作都是在application-local.yml配置文件里完成。
(1)配置數(shù)據(jù)庫(kù)
spring:
devtools:
restart:
additional-paths: src/main/java
thymeleaf:
cache: false
# REDIS數(shù)據(jù)庫(kù)配置
redis:
# [必須修改] Redis服務(wù)器IP, REDIS安裝在本機(jī)的,使用127.0.0.1
host: 127.0.0.1
# [必須修改] 端口號(hào)
port: 6379
# [可選] 數(shù)據(jù)庫(kù) DB
database: 6
# [可選] 訪問(wèn)密碼,若你的redis服務(wù)器沒(méi)有設(shè)置密碼,就不需要用密碼去連接
password:
# [可選] 超時(shí)時(shí)間
timeout: 10000
# [可選] jdbc數(shù)據(jù)庫(kù)配置, 項(xiàng)目使用sqlite作為數(shù)據(jù)庫(kù),一般不需要配置
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服務(wù)器啟動(dòng)端口
# [可選] WVP**的HTTP端口, 網(wǎng)頁(yè)和接口調(diào)用都是這個(gè)端口
server:
port: 18080
(3)28181服務(wù)配置
# 作為28181服務(wù)器的配置
sip:
# [必須修改] 本機(jī)的IP,這里是我本地ip
ip: 10.10.10.110
# [可選] 28181服務(wù)**的端口
port: 6060
# 根據(jù)國(guó)標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國(guó)標(biāo)附錄D中定義前8位為中心編碼(由省級(jí)、市級(jí)、區(qū)級(jí)、基層編號(hào)組成,參照GB/T 2260-2007)
# 后兩位為行業(yè)編碼,定義參照附錄D.3
# 3701020049標(biāo)識(shí)山東濟(jì)南歷下區(qū) 信息行業(yè)接入
# [可選]
domain: 4401020049
# [可選]
id: 44010200492000000001
# [可選] 默認(rèn)設(shè)備認(rèn)證密碼,移除密碼將不進(jìn)行校驗(yàn)
password: 1234567890
(4)zlm默認(rèn)服務(wù)器配置(wvp啟動(dòng)的時(shí)候會(huì)去尋找默認(rèn)的zlm服務(wù)器)
#zlm 默認(rèn)服務(wù)器配置
media:
# [必須修改] zlm服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,general.mediaServerId
id:
# [必須修改] zlm服務(wù)器的內(nèi)網(wǎng)IP
ip: 10.10.10.110
# [可選] 返回流地址時(shí)的ip,置空使用 media.ip
stream-ip:
# [可選] wvp在國(guó)標(biāo)信令中使用的ip,此ip為**可以訪問(wèn)到的ip, 置空使用 media.ip
sdp-ip:
# [可選] zlm服務(wù)器的hook所使用的IP, 默認(rèn)使用sip.ip
hook-ip:
# [必須修改] zlm服務(wù)器的http.port
http-port: 80
# [可選] zlm服務(wù)器的http.sslport, 置空使用zlm配置文件配置
http-ssl-port:
# [可選] zlm服務(wù)器的rtmp.port, 置空使用zlm配置文件配置
rtmp-port:
# [可選] zlm服務(wù)器的rtmp.sslport, 置空使用zlm配置文件配置
rtmp-ssl-port:
# [可選] zlm服務(wù)器的 rtp_proxy.port, 置空使用zlm配置文件配置
rtp-proxy-port:
# [可選] zlm服務(wù)器的 rtsp.port, 置空使用zlm配置文件配置
rtsp-port:
# [可選] zlm服務(wù)器的 rtsp.sslport, 置空使用zlm配置文件配置
rtsp-ssl-port:
# [可選] 是否自動(dòng)配置ZLM, 如果希望手動(dòng)配置ZLM, 可以設(shè)為false, 不建議新接觸的用戶修改
auto-config: true
# [可選] zlm服務(wù)器的hook.admin_params=secret
secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc
# 啟用多端口模式, 多端口模式使用端口區(qū)分每路流,兼容性更好。 單端口使用流的ssrc區(qū)分, 點(diǎn)播超時(shí)建議使用多端口測(cè)試
rtp:
# [可選] 是否啟用多端口模式, 開啟后會(huì)在portRange范圍內(nèi)選擇端口用于媒體流傳輸
enable: true
# [可選] 在此范圍內(nèi)選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動(dòng)配置此屬性可能不成功
port-range: 30000,30500 # 端口范圍
# 錄像輔助服務(wù), 部署此服務(wù)可以實(shí)現(xiàn)zlm錄像的管理與下載, 0 表示不使用
record-assist-port: 0
(5)其他配置(具體可根據(jù)業(yè)務(wù)自行調(diào)整)
# [根據(jù)業(yè)務(wù)需求配置]
user-settings:
# 推流直播是否錄制
record-push-live: true
auto-apply-play: false
# [可選] 部分設(shè)備需要擴(kuò)展SDP,需要打開此設(shè)置
senior-sdp: false
# 保存移動(dòng)位置歷史軌跡:true:保留歷史數(shù)據(jù),false:僅保留最后的位置(默認(rèn))
save-position-history: false
# 點(diǎn)播/錄像回放 等待超時(shí)時(shí)間,單位:毫秒
play-timeout: 18000
# 上級(jí)點(diǎn)播等待超時(shí)時(shí)間,單位:毫秒
platform-play-timeout: 60000
# 是否開啟接口鑒權(quán)
interface-authentication: true
# 接口鑒權(quán)例外的接口, 即不進(jìn)行接口鑒權(quán)的接口,盡量詳細(xì)書寫,盡量不用/**,至少兩級(jí)目錄
interface-authentication-excludes:
– /api/v1/**
# 國(guó)標(biāo)是否錄制
record-sip: true
# 是否將日志存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)
logInDatebase: true
# 使用推流狀態(tài)作為推流通道狀態(tài)
use-pushing-as-status: true
# 使用來(lái)源請(qǐng)求ip作為streamIp,當(dāng)且僅當(dāng)你只有zlm節(jié)點(diǎn)它與wvp在一起的情況下開啟
use-source-ip-as-stream-ip: true
# 國(guó)標(biāo)點(diǎn)播 按需拉流, true:有人觀看拉流,無(wú)人觀看釋放, false:拉起后不自動(dòng)釋放
stream-on-demand: true
# 推流鑒權(quán), 默認(rèn)開啟
push-authority: true
# 國(guó)標(biāo)級(jí)聯(lián)發(fā)流嚴(yán)格模式,嚴(yán)格模式會(huì)使用與sdp信息中一致的端口發(fā)流,端口共享media.rtp.port-range,這會(huì)損失一些性能,
# 非嚴(yán)格模式使用隨機(jī)端口發(fā)流,性能更好, 默認(rèn)關(guān)閉
gb-send-stream-strict: false
# 設(shè)備上線時(shí)是否自動(dòng)同步通道
sync-channel-on-device-online: false
# 是否使用設(shè)備來(lái)源Ip作為回復(fù)IP, 不設(shè)置則為 false
sip-use-source-ip-as-remote-address: false
# 是否開啟sip日志
sip-log: true
# 自動(dòng)數(shù)據(jù)庫(kù)升級(jí),保證表結(jié)構(gòu)完整
sync-db: false
(6)編譯wvp
啟動(dòng)IntelliJ IDEA,打開wvp項(xiàng)目,開始編譯??吹匠霈F(xiàn)這樣的界面,表明編譯并且運(yùn)行成功。
編譯wvp
3.編譯zlm
(1)打開安裝好的Cmake,選擇zlm項(xiàng)目所在位置,并且選擇你build項(xiàng)目時(shí)的位置,這里我們就放在同一目錄下,方便管理。
選擇項(xiàng)目目錄和build目錄
下一步,點(diǎn)擊Yes
(2)點(diǎn)擊Configure
(3)點(diǎn)擊Genrate,可以看到兩個(gè)步驟都提示成功了。
(4)選擇打開項(xiàng)目,就會(huì)自動(dòng)打開Visual Studio 2017
打開項(xiàng)目
(5)這里我們直接可以按下圖**作,你也可以選擇Release
選擇之后點(diǎn)擊本地Windows調(diào)試器
(6)這里編譯需要一定時(shí)間,耐心等待。
編譯成功
(7)出現(xiàn)編譯完成的提示后,去項(xiàng)目目錄下找到Debug目錄或者Release目錄。目錄位置位于release目錄下
zlm應(yīng)用程序入口目錄
最終應(yīng)用程序
(8)這里我們不能直接點(diǎn)擊MediaServer.exe,需要對(duì)其進(jìn)行配置,我們?cè)谏弦粋€(gè)目錄,會(huì)看到一個(gè)config.ini文件,打開并將它**到MediaServer.exe所在目錄。當(dāng)然,你也可以直接打開MediaServer.exe,第二它也會(huì)在當(dāng)前目錄自動(dòng)生成一個(gè)config.ini文件,你打開config.ini進(jìn)去配置即可。
配置文件示例
(9)zlm配置文件詳細(xì)配置如下,開發(fā)者可根據(jù)自己的實(shí)際情況調(diào)整
#!!!!此配置文件為范例配置文件,意在告訴讀者,各個(gè)配置項(xiàng)的具體含義和作用,
#!!!!該配置文件在執(zhí)行cmake時(shí),會(huì)拷貝至release/${**作系統(tǒng)類型}/${編譯類型}(例如release/linux/Debug) 文件夾。
#!!!!該文件夾(release/${**作系統(tǒng)類型}/${編譯類型})同時(shí)也是可執(zhí)行程序生成目標(biāo)路徑,在執(zhí)行MediaServer進(jìn)程時(shí),它會(huì)默認(rèn)加載同目錄下的config.ini文件作為配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不會(huì)被MediaServer進(jìn)程加載,因?yàn)镸ediaServer進(jìn)程默認(rèn)加載的是release/${**作系統(tǒng)類型}/${編譯類型}/config.ini。
#!!!!當(dāng)然,你每次執(zhí)行cmake,該文件確實(shí)會(huì)被拷貝至release/${**作系統(tǒng)類型}/${編譯類型}/config.ini,
#!!!!但是一般建議你直接修改release/${**作系統(tǒng)類型}/${編譯類型}/config.ini文件,修改此文件一般不起作用,除非你運(yùn)行MediaServer時(shí)使用-c參數(shù)指定到此文件。
[api]
#是否調(diào)試http api,啟用調(diào)試后,會(huì)打印每次http請(qǐng)求的內(nèi)容和回復(fù)
apiDebug=1
#一些比較敏感的http api在訪問(wèn)時(shí)需要提供secret,否則無(wú)權(quán)限調(diào)用
#如果是通過(guò)127.0.0.1訪問(wèn),那么可以不提供secret
secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#截圖保存路徑根目錄,截圖通過(guò)http api(/index/api/getSnap)生成和獲取
snapRoot=./www/snap/
#默認(rèn)截圖圖片,在啟動(dòng)FFmpeg截圖后但是截圖還未生成時(shí),可以返回默認(rèn)的預(yù)設(shè)圖片
defaultSnap=./www/logo.png
[ffmpeg]
#FFmpeg可執(zhí)行程序路徑,支持相對(duì)路徑/絕對(duì)路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通過(guò)該模板可以設(shè)置再編碼的一些參數(shù)
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的命令,可以通過(guò)修改該配置改變截圖分辨率或質(zhì)量
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
log=./ffmpeg/ffmpeg.log
# 自動(dòng)重啟的時(shí)間(秒), 默認(rèn)為0, 也就是不自動(dòng)重啟. 主要是為了避免長(zhǎng)時(shí)間ffmpeg拉流導(dǎo)致的不同步現(xiàn)象
restart_sec=0
#轉(zhuǎn)協(xié)議相關(guān)開關(guān);如果addStreamProxy api和on_publish hook回復(fù)未指定轉(zhuǎn)協(xié)議參數(shù),則采用這些配置項(xiàng)
[protocol]
#轉(zhuǎn)協(xié)議時(shí),是否開啟幀級(jí)時(shí)間戳覆蓋
modify_stamp=0
#轉(zhuǎn)協(xié)議是否開啟音頻
enable_audio=1
#添加acc靜音音頻,在關(guān)閉音頻時(shí),此開關(guān)無(wú)效
add_mute_audio=1
#推流斷開后可以在超時(shí)時(shí)間內(nèi)重新連接上繼續(xù)推流,這樣播放器會(huì)接著播放。
#置0關(guān)閉此特性(推流斷開會(huì)導(dǎo)致立即斷開播放器)
#此參數(shù)不應(yīng)大于播放器超時(shí)時(shí)間;單位毫秒
continue_push_ms=15000
#是否開啟轉(zhuǎn)換為hls
enable_hls=1
#是否開啟MP4錄制
enable_mp4=0
#是否開啟轉(zhuǎn)換為rtsp/webrtc
enable_rtsp=1
#是否開啟轉(zhuǎn)換為rtmp/flv
enable_rtmp=1
#是否開啟轉(zhuǎn)換為http-ts/ws-ts
enable_ts=1
#是否開啟轉(zhuǎn)換為http-fmp4/ws-fmp4
enable_fmp4=1
#是否將mp4錄制當(dāng)做觀看者
mp4_as_player=0
#mp4切片大小,單位秒
mp4_max_second=3600
#mp4錄制保存路徑
mp4_save_path=./www
#hls錄制保存路徑
hls_save_path=./www
###### 以下是按需轉(zhuǎn)協(xié)議的開關(guān),在測(cè)試ZLMediaKit的接收推流性能時(shí),請(qǐng)把下面開關(guān)置1
###### 如果某種協(xié)議你用不到,你可以把以下開關(guān)置1以便節(jié)省資源(但是還是可以播放,只是第一個(gè)播放者體驗(yàn)稍微差點(diǎn)),
###### 如果某種協(xié)議你想獲取最好的用戶體驗(yàn),請(qǐng)置0(第一個(gè)播放者可以秒開,且不花屏)
#hls協(xié)議是否按需生成,如果hls.segNum配置為0(意味著hls錄制),那么hls將一直生成(不管此開關(guān))
hls_demand=0
#rtsp[s]協(xié)議是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協(xié)議是否按需生成
rtmp_demand=0
#http[s]-ts協(xié)議是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協(xié)議是否按需生成
fmp4_demand=0
[general]
#是否啟用虛擬主機(jī)
enableVhost=0
#播放器或推流器在斷開后會(huì)觸發(fā)hook.on_flow_report**(使用多少流量**),
#flowThreshold參數(shù)控制觸發(fā)hook.on_flow_report**閾值,使用流量超過(guò)該閾值后才觸發(fā),單位KB
flowThreshold=1024
#播放最多等待時(shí)間,單位毫秒
#播放在播放某個(gè)流時(shí),如果該流不存在,
#ZLMediaKit會(huì)最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個(gè)時(shí)間內(nèi),該流注冊(cè)成功,那么會(huì)立即返回播放器播放成功
#否則返回播放器未找到該流,該機(jī)制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個(gè)流無(wú)人觀看時(shí),觸發(fā)hook.on_stream_none_reader**的最大等待時(shí)間,單位毫秒
#在配合hook.on_stream_none_reader**時(shí),可以做到無(wú)人觀看自動(dòng)停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流**時(shí)如果斷流再重連成功是否刪除前一次的媒體流數(shù)據(jù),如果刪除將重新開始,
#如果不刪除將會(huì)接著上一次的數(shù)據(jù)繼續(xù)寫(錄制hls/mp4時(shí)會(huì)繼續(xù)在前一個(gè)文件后面寫)
resetWhenRePlay=1
#合并寫緩存大小(單位毫秒),合并寫指服務(wù)器緩存一定的數(shù)據(jù)后才會(huì)一次性寫入socket,這樣能提高性能,但是會(huì)提高延時(shí)
#開啟后會(huì)同時(shí)關(guān)閉TCP_NODELAY并開啟MSG_MORE
mergeWriteMS=0
#服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,
#這里需要修改成自己定義的,your_server_id只是提示你是你自己服務(wù)器的id
#很多新手看都不看就原封不動(dòng)的使用
mediaServerId=your_server_id
#最多等待未初始化的Track時(shí)間,單位毫秒,超時(shí)之后會(huì)忽略未初始化的Track
wait_track_ready_ms=10000
#如果流只有單Track,最多等待若干毫秒,超時(shí)后未收到其他Track的數(shù)據(jù),則認(rèn)為是單Track
#如果協(xié)議元數(shù)據(jù)有聲明特定track數(shù),那么無(wú)此等待時(shí)間
wait_add_track_ms=3000
#如果track未就緒,我們先緩存幀數(shù)據(jù),但是有最大個(gè)數(shù)限制,防止內(nèi)存溢出
unready_frame_cache=100
[hls]
#hls寫文件的buf大小,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#hls最大切片時(shí)間
segDur=2
#m3u8索引中,hls保留切片個(gè)數(shù)(實(shí)際保留切片個(gè)數(shù)大2~3個(gè))
#如果設(shè)置為0,則不刪除切片,而是保存為點(diǎn)播
segNum=3
#HLS切片從m3u8文件中移除后,繼續(xù)保留在磁盤上的個(gè)數(shù)
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls文件刪除延時(shí),單位秒,issue: #913
deleteDelaySec=10
#是否保留hls文件,此功能部分等效于segNum=0的情況
#不同的是這個(gè)保留不會(huì)在m3u8文件中體現(xiàn)
#0為不保留,不起作用
#1為保留,則不刪除hls文件,如果開啟此功能,注意磁盤大小,或者定期手動(dòng)清理hls文件
segKeep=0
[hook]
#在推流時(shí),如果url參數(shù)匹對(duì)admin_params,那么可以不經(jīng)過(guò)hook鑒權(quán)直接推流成功,播放時(shí)亦然
#該配置項(xiàng)的目的是為了開發(fā)者自己調(diào)試測(cè)試,該參數(shù)暴露后會(huì)有泄露隱私的安全隱患
admin_params=secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#是否啟用hook**,啟用后,推拉流都將進(jìn)行鑒權(quán)
enable=0
#播放器或推流器使用流量**,置空則關(guān)閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#訪問(wèn)http文件鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權(quán)**,置空則關(guān)閉鑒權(quán)
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播放鑒權(quán)**,此**中比對(duì)rtsp的用戶名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權(quán)**,置空則關(guān)閉rtsp鑒權(quán)。rtsp播放鑒權(quán)還支持url方式鑒權(quán)
#建議開發(fā)者統(tǒng)一采用url參數(shù)方式鑒權(quán),rtsp用戶名密碼鑒權(quán)一般在設(shè)備上用的比較多
#開啟rtsp專屬鑒權(quán)后,將不再觸發(fā)on_play鑒權(quán)**
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠(yuǎn)程telnet調(diào)試鑒權(quán)**
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊(cè)或注銷**
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無(wú)人觀看流**,通過(guò)該**,可以選擇是否關(guān)閉無(wú)人觀看的流。配合general.streamNoneReaderDelayMS選項(xiàng)一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時(shí),未找到流**,通過(guò)配合hook.on_stream_none_reader**可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#服務(wù)器啟動(dòng)報(bào)告,可以用于服務(wù)器的崩潰重啟****
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server?;钌蠄?bào)
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#發(fā)送rtp(startSendRtp)被動(dòng)關(guān)閉時(shí)回調(diào)
on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped
#rtp server 超時(shí)未收到數(shù)據(jù)
on_rtp_server_timeout=https://127.0.0.1/index/hook/on_rtp_server_timeout
#hook api最大等待回復(fù)時(shí)間,單位秒
timeoutSec=10
#keepalive hook觸發(fā)間隔,單位秒,float類型
alive_interval=10.0
#hook通知失敗重試次數(shù),正整數(shù)。為0不重試,1時(shí)重試一次,以此類推
retry=1
#hook通知失敗重試延時(shí),單位秒,float型
retry_delay=3.0
[cluster]
#設(shè)置源站拉流url模板, 格式跟printf類似,第一個(gè)%s指定app,第二個(gè)%s指定stream_id,
#開啟集群模式后,on_stream_not_found和on_stream_none_reader hook將無(wú)效.
#溯源模式支持以下類型:
#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
#支持多個(gè)源站,不同源站通過(guò)分號(hào)(;)分隔
origin_url=
#溯源總超時(shí)時(shí)長(zhǎng),單位秒,float型;假如源站有3個(gè),那么單次溯源超時(shí)時(shí)間為timeout_sec除以3
#單次溯源超時(shí)時(shí)間不要超過(guò)general.maxStreamWaitMS配置
timeout_sec=15
#溯源失敗嘗試次數(shù),-1時(shí)**嘗試
retry_count=3
[http]
#http服務(wù)器字符編碼,windows上默認(rèn)gb2312
charSet=utf-8
#http鏈接超時(shí)時(shí)間
keepAliveSecond=30
#http請(qǐng)求體最大字節(jié)數(shù),如果post的body太大,則不適合緩存body在內(nèi)存
maxReqSize=40960
#404網(wǎng)頁(yè)內(nèi)容,用戶可以自定義404網(wǎng)頁(yè)
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您訪問(wèn)的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服務(wù)器**端口
port=80
#http文件服務(wù)器根目錄
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
rootPath=./www
#http文件服務(wù)器讀文件緩存大小,單位BYTE,調(diào)整該參數(shù)可以優(yōu)化文件io性能
sendBufSize=65536
#https服務(wù)器**端口
sslport=443
#是否顯示文件夾菜單,開啟后可以瀏覽文件夾
dirMenu=1
#虛擬目錄, 虛擬目錄名和文件路徑使用","隔開,多個(gè)配置路徑間用";"隔開
#例如賦值為 app_a,/path/to/a;app_b,/path/to/b 那么
#訪問(wèn) http://127.0.0.1/app_a/file_a 對(duì)應(yīng)的文件路徑為 /path/to/a/file_a
#訪問(wèn) http://127.0.0.1/app_b/file_b 對(duì)應(yīng)的文件路徑為 /path/to/b/file_b
#訪問(wèn)其他http路徑,對(duì)應(yīng)的文件路徑還是在rootPath內(nèi)
virtualPath=
#禁止后綴的文件使用mmap緩存,使用“,”隔開
#例如賦值為 .mp4,.flv
#那么訪問(wèn)后綴為.mp4與.flv 的文件不緩存
forbidCacheSuffix=
#可以把http**前真實(shí)客戶端ip放在http頭中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否則可能導(dǎo)致偽造客戶端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點(diǎn)播的應(yīng)用名,通過(guò)限制應(yīng)用名,可以防止隨意點(diǎn)播
#點(diǎn)播的文件必須放置在此文件夾下
appName=record
#mp4錄制寫文件緩存,單位BYTE,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#mp4點(diǎn)播每次流化數(shù)據(jù)量,單位毫秒,
#減少該值可以讓點(diǎn)播數(shù)據(jù)發(fā)送量更平滑,增大該值則更節(jié)省cpu資源
sampleMS=500
#mp4錄制完成后是否進(jìn)行二次關(guān)鍵幀索引寫入頭部
fastStart=0
#MP4點(diǎn)播(rtsp/rtmp/http-flv/ws-flv)是否循環(huán)播放文件
fileRepeat=0
[rtmp]
#rtmp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtmp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#在接收rtmp推流時(shí),是否重新生成時(shí)間戳(很多推流器的時(shí)間戳著實(shí)很爛)
modifyStamp=0
#rtmp服務(wù)器**端口
port=1935
#rtmps服務(wù)器**地址
sslport=0
[rtp]
#音頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
#加大該值會(huì)明顯增加直播延時(shí)
audioMtuSize=600
#視頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
videoMtuSize=1400
#rtp包最大長(zhǎng)度限制,單位KB,主要用于識(shí)別TCP上下文破壞時(shí),獲取到錯(cuò)誤的rtp
rtpMaxSize=10
# rtp 打包時(shí),低延遲開關(guān),默認(rèn)關(guān)閉(為0),h264存在一幀多個(gè)slice(NAL)的情況,在這種情況下,如果開啟可能會(huì)導(dǎo)致畫面花屏
lowLatency=0
[rtp_proxy]
#導(dǎo)出調(diào)試數(shù)據(jù)(包括rtp/ps/h264)至該目錄,置空則關(guān)閉數(shù)據(jù)導(dǎo)出
dumpDir=
#udp和tcp**服務(wù)器,支持rtp(必須是ts或ps類型)**
port=10000
#rtp超時(shí)時(shí)間,單位秒
timeoutSec=15
#隨機(jī)端口范圍,最少確保36個(gè)端口
#該范圍同時(shí)限制rtsp服務(wù)器udp端口范圍
port_range=30000-35000
#rtp h264 負(fù)載的pt
h264_pt=98
#rtp h265 負(fù)載的pt
h265_pt=99
#rtp ps 負(fù)載的pt
ps_pt=96
#rtp opus 負(fù)載的pt
opus_pt=100
[rtc]
#rtc播放推流、播放超時(shí)時(shí)間
timeoutSec=15
#本機(jī)對(duì)rtc客戶端的可見ip,作為服務(wù)器時(shí)一般為公網(wǎng)ip,可有多個(gè),用','分開,當(dāng)置空時(shí),會(huì)自動(dòng)獲取網(wǎng)卡ip
#同時(shí)支持環(huán)境變量,以$開頭,如"$EXTERN_IP"; 請(qǐng)參考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服務(wù)器**端口號(hào),所有rtc客戶端將通過(guò)該端口傳輸stun/dtls/srtp/srtcp數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
port=8000
#rtc tcp服務(wù)器**端口號(hào),在udp 不通的情況下,會(huì)使用tcp傳輸數(shù)據(jù)
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
tcpPort = 8000
#設(shè)置remb比特率,非0時(shí)關(guān)閉twcc并開啟remb。該設(shè)置在rtc推流時(shí)有效,可以控制推流畫質(zhì)
#目前已經(jīng)實(shí)現(xiàn)twcc自動(dòng)調(diào)整碼率,關(guān)閉remb根據(jù)真實(shí)網(wǎng)絡(luò)狀況調(diào)整碼率
rembBitRate=0
#rtc支持的音頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的音頻codec
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
#rtc支持的視頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的視頻codec
preferredCodecV=H264,H265,AV1,VP9,VP8
[srt]
#srt播放推流、播放超時(shí)時(shí)間,單位秒
timeoutSec=5
#srt udp服務(wù)器**端口號(hào),所有srt客戶端將通過(guò)該端口傳輸srt數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
port=9000
#srt 協(xié)議中延遲緩存的估算參數(shù),在握手階段估算rtt ,第二latencyMul*rtt 為最大緩存時(shí)長(zhǎng),此參數(shù)越大,表示等待重傳的時(shí)長(zhǎng)就越大
latencyMul=4
#包緩存的大小
pktBufSize=8192
[rtsp]
#rtsp專有鑒權(quán)方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流**是否是直接**模式
#直接**后支持任意編碼格式,但是會(huì)導(dǎo)致GOP緩存無(wú)法**到I幀,可能會(huì)導(dǎo)致開播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu會(huì)導(dǎo)致無(wú)法使用udp方式**
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接**的方式來(lái)支持rtsp**
#如果你是rtsp推拉流,但是webrtc播放,也建議關(guān)閉直接**模式,
#因?yàn)橹苯?*時(shí),rtp中可能沒(méi)有sps pps,會(huì)導(dǎo)致webrtc無(wú)法播放; 另外webrtc也不支持Single NAL Unit Packets類型rtp
#默認(rèn)開啟rtsp直接**,rtmp由于沒(méi)有這些問(wèn)題,是強(qiáng)制開啟直接**的
directProxy=1
#rtsp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtsp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#rtsp服務(wù)器**地址
port=554
#rtsps服務(wù)器**地址
sslport=0
#rtsp 轉(zhuǎn)發(fā)是否使用低延遲模式,當(dāng)開啟時(shí),不會(huì)緩存rtp包,來(lái)提高并發(fā),可以降低一幀的延遲
lowLatency=0
[shell]
#調(diào)試telnet服務(wù)器接受最**ufffer大小
maxReqSize=1024
#調(diào)試telnet服務(wù)器**端口
port=0
(10)點(diǎn)擊MediaServer.exe啟動(dòng)zlm,出現(xiàn)如下界面,說(shuō)明啟動(dòng)成功。
4.運(yùn)行前端程序
(1)編譯程序
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
(2)運(yùn)行程序
# 本地運(yùn)行命令
npm run dev
出現(xiàn)這樣的提示說(shuō)明運(yùn)行成功
(3)出現(xiàn)上圖的提示說(shuō)明成功,在瀏覽器輸入http://127.0.0.1:8082,即可訪問(wèn)前端頁(yè)面
用戶登錄
(4)主頁(yè)看板展示
主頁(yè)看板
三、設(shè)備接入
(1)這里我們以大華攝像頭為例
攝像頭配置界面
(2)編輯好相應(yīng)參數(shù)后,點(diǎn)擊確定即可注冊(cè)到平臺(tái)。
設(shè)備注冊(cè)上平臺(tái)
(3)點(diǎn)播設(shè)備,測(cè)試是否正常拉流
通道信息
實(shí)際拉流效果
到這里zlm+wvp流媒體平臺(tái)搭建教程就結(jié)束了,對(duì)于新手的開發(fā)者,可以讓他們少走不少?gòu)澛?,好將更多的時(shí)間用在二次開發(fā)和產(chǎn)品打磨上。本文不足和沒(méi)有涉及到的地方,歡迎留言指正!
最后附上我在此框架上二次開發(fā)的項(xiàng)目截圖,目前已經(jīng)運(yùn)用在實(shí)際項(xiàng)目中,有相關(guān)經(jīng)驗(yàn)開發(fā)者的可以留言交流。
首頁(yè)看板
視頻**
系統(tǒng)運(yùn)行情況
ps:最后感謝zlm框架和wvp框架作者,提供這么好的開源框架~
拓展知識(shí):
前沿拓展:
win7 **r
32位基本兼容所有的軟件了。
不過(guò)你說(shuō)的這個(gè)不清楚
我現(xiàn)在就在用win7,感覺很不錯(cuò),沒(méi)出現(xiàn)過(guò)不兼容的情況
在流媒體日趨成熟的今天,大家每天都會(huì)刷大量視頻,又或者擁有一部手機(jī)就能遠(yuǎn)程查看家里的**;那作為新手的你,怎么從無(wú)到有打造自己的流媒體平臺(tái)呢?
這里我們選用wvp+ZLMediaKit開源平臺(tái),WEB VIDEO PLATFORM(wvp)是一個(gè)基于GB28181-2016標(biāo)準(zhǔn)實(shí)現(xiàn)的網(wǎng)絡(luò)視頻平臺(tái),支持NAT穿透,支持???、大華、宇視等品牌的IPC、NVR、**R接入。支持國(guó)標(biāo)級(jí)聯(lián),支持rtsp/rtmp等視頻流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái),支持rtsp/rtmp等推流轉(zhuǎn)發(fā)到國(guó)標(biāo)平臺(tái)。
一、準(zhǔn)備工作
1.安裝所需工具
maven(管理java代碼依賴)、ffmpeg、nodejs(版本根據(jù)自己項(xiàng)目的需要安裝,我本人安裝的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根據(jù)個(gè)人情況下載不同版本,本人使用的是2017,windows最好也用這個(gè)版本)、Cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue編輯器可自行選擇,我使用的是HBuilder X。
2.從github克隆zlm代碼
# 國(guó)內(nèi)用戶推薦從同步鏡像網(wǎng)站gitee下載
git clone –depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千萬(wàn)不要忘記執(zhí)行這句命令
git submodule update –init
3.同理克隆wvp代碼
git clone https://github.com/648540858/wvp-GB28181-pro.git
二、開始編譯工作
1.編譯前端代碼
前端代碼采用的是vue+element編寫,所以你如果想要深入學(xué)習(xí),可以相應(yīng)的去熟悉一下vue的語(yǔ)法和element的組件用法。
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
# 安裝依賴命令
npm –registry=https://registry.npm.taobao.org install
# 打包命令
npm run build
# 本地運(yùn)行命令
npm run dev
# 當(dāng)然,如果你喜歡用yarn,這里也可以換成yarn命令去**作,具體實(shí)現(xiàn)可以自行研究一下
2.編譯wvp
在編譯之前,我們需要對(duì)配置文件進(jìn)行配置,項(xiàng)目目錄如下所示:
項(xiàng)目文件目錄預(yù)覽
該項(xiàng)目數(shù)據(jù)庫(kù)在sql文件夾里,點(diǎn)擊打開之后就會(huì)看到一個(gè)sql文件。
數(shù)據(jù)庫(kù)文件
開發(fā)者可以自行導(dǎo)入數(shù)據(jù)庫(kù)里。隨著wvp版本更新,數(shù)據(jù)庫(kù)可能會(huì)有差異,具體以實(shí)際文件為準(zhǔn)。
數(shù)據(jù)庫(kù)表預(yù)覽(具體以新版本數(shù)據(jù)庫(kù)為準(zhǔn))
項(xiàng)目配置文件位于srcmainresources目錄下,如果開發(fā)者采用打包即用,不用指定配置文件的情況下,可以修改application-local.yml,如果指定其他配置文件,可以在application.yml里修改。
配置文件路徑預(yù)覽
注意,以下配置的**作都是在application-local.yml配置文件里完成。
(1)配置數(shù)據(jù)庫(kù)
spring:
devtools:
restart:
additional-paths: src/main/java
thymeleaf:
cache: false
# REDIS數(shù)據(jù)庫(kù)配置
redis:
# [必須修改] Redis服務(wù)器IP, REDIS安裝在本機(jī)的,使用127.0.0.1
host: 127.0.0.1
# [必須修改] 端口號(hào)
port: 6379
# [可選] 數(shù)據(jù)庫(kù) DB
database: 6
# [可選] 訪問(wèn)密碼,若你的redis服務(wù)器沒(méi)有設(shè)置密碼,就不需要用密碼去連接
password:
# [可選] 超時(shí)時(shí)間
timeout: 10000
# [可選] jdbc數(shù)據(jù)庫(kù)配置, 項(xiàng)目使用sqlite作為數(shù)據(jù)庫(kù),一般不需要配置
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服務(wù)器啟動(dòng)端口
# [可選] WVP**的HTTP端口, 網(wǎng)頁(yè)和接口調(diào)用都是這個(gè)端口
server:
port: 18080
(3)28181服務(wù)配置
# 作為28181服務(wù)器的配置
sip:
# [必須修改] 本機(jī)的IP,這里是我本地ip
ip: 10.10.10.110
# [可選] 28181服務(wù)**的端口
port: 6060
# 根據(jù)國(guó)標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國(guó)標(biāo)附錄D中定義前8位為中心編碼(由省級(jí)、市級(jí)、區(qū)級(jí)、基層編號(hào)組成,參照GB/T 2260-2007)
# 后兩位為行業(yè)編碼,定義參照附錄D.3
# 3701020049標(biāo)識(shí)山東濟(jì)南歷下區(qū) 信息行業(yè)接入
# [可選]
domain: 4401020049
# [可選]
id: 44010200492000000001
# [可選] 默認(rèn)設(shè)備認(rèn)證密碼,移除密碼將不進(jìn)行校驗(yàn)
password: 1234567890
(4)zlm默認(rèn)服務(wù)器配置(wvp啟動(dòng)的時(shí)候會(huì)去尋找默認(rèn)的zlm服務(wù)器)
#zlm 默認(rèn)服務(wù)器配置
media:
# [必須修改] zlm服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,general.mediaServerId
id:
# [必須修改] zlm服務(wù)器的內(nèi)網(wǎng)IP
ip: 10.10.10.110
# [可選] 返回流地址時(shí)的ip,置空使用 media.ip
stream-ip:
# [可選] wvp在國(guó)標(biāo)信令中使用的ip,此ip為**可以訪問(wèn)到的ip, 置空使用 media.ip
sdp-ip:
# [可選] zlm服務(wù)器的hook所使用的IP, 默認(rèn)使用sip.ip
hook-ip:
# [必須修改] zlm服務(wù)器的http.port
http-port: 80
# [可選] zlm服務(wù)器的http.sslport, 置空使用zlm配置文件配置
http-ssl-port:
# [可選] zlm服務(wù)器的rtmp.port, 置空使用zlm配置文件配置
rtmp-port:
# [可選] zlm服務(wù)器的rtmp.sslport, 置空使用zlm配置文件配置
rtmp-ssl-port:
# [可選] zlm服務(wù)器的 rtp_proxy.port, 置空使用zlm配置文件配置
rtp-proxy-port:
# [可選] zlm服務(wù)器的 rtsp.port, 置空使用zlm配置文件配置
rtsp-port:
# [可選] zlm服務(wù)器的 rtsp.sslport, 置空使用zlm配置文件配置
rtsp-ssl-port:
# [可選] 是否自動(dòng)配置ZLM, 如果希望手動(dòng)配置ZLM, 可以設(shè)為false, 不建議新接觸的用戶修改
auto-config: true
# [可選] zlm服務(wù)器的hook.admin_params=secret
secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc
# 啟用多端口模式, 多端口模式使用端口區(qū)分每路流,兼容性更好。 單端口使用流的ssrc區(qū)分, 點(diǎn)播超時(shí)建議使用多端口測(cè)試
rtp:
# [可選] 是否啟用多端口模式, 開啟后會(huì)在portRange范圍內(nèi)選擇端口用于媒體流傳輸
enable: true
# [可選] 在此范圍內(nèi)選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動(dòng)配置此屬性可能不成功
port-range: 30000,30500 # 端口范圍
# 錄像輔助服務(wù), 部署此服務(wù)可以實(shí)現(xiàn)zlm錄像的管理與下載, 0 表示不使用
record-assist-port: 0
(5)其他配置(具體可根據(jù)業(yè)務(wù)自行調(diào)整)
# [根據(jù)業(yè)務(wù)需求配置]
user-settings:
# 推流直播是否錄制
record-push-live: true
auto-apply-play: false
# [可選] 部分設(shè)備需要擴(kuò)展SDP,需要打開此設(shè)置
senior-sdp: false
# 保存移動(dòng)位置歷史軌跡:true:保留歷史數(shù)據(jù),false:僅保留最后的位置(默認(rèn))
save-position-history: false
# 點(diǎn)播/錄像回放 等待超時(shí)時(shí)間,單位:毫秒
play-timeout: 18000
# 上級(jí)點(diǎn)播等待超時(shí)時(shí)間,單位:毫秒
platform-play-timeout: 60000
# 是否開啟接口鑒權(quán)
interface-authentication: true
# 接口鑒權(quán)例外的接口, 即不進(jìn)行接口鑒權(quán)的接口,盡量詳細(xì)書寫,盡量不用/**,至少兩級(jí)目錄
interface-authentication-excludes:
– /api/v1/**
# 國(guó)標(biāo)是否錄制
record-sip: true
# 是否將日志存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)
logInDatebase: true
# 使用推流狀態(tài)作為推流通道狀態(tài)
use-pushing-as-status: true
# 使用來(lái)源請(qǐng)求ip作為streamIp,當(dāng)且僅當(dāng)你只有zlm節(jié)點(diǎn)它與wvp在一起的情況下開啟
use-source-ip-as-stream-ip: true
# 國(guó)標(biāo)點(diǎn)播 按需拉流, true:有人觀看拉流,無(wú)人觀看釋放, false:拉起后不自動(dòng)釋放
stream-on-demand: true
# 推流鑒權(quán), 默認(rèn)開啟
push-authority: true
# 國(guó)標(biāo)級(jí)聯(lián)發(fā)流嚴(yán)格模式,嚴(yán)格模式會(huì)使用與sdp信息中一致的端口發(fā)流,端口共享media.rtp.port-range,這會(huì)損失一些性能,
# 非嚴(yán)格模式使用隨機(jī)端口發(fā)流,性能更好, 默認(rèn)關(guān)閉
gb-send-stream-strict: false
# 設(shè)備上線時(shí)是否自動(dòng)同步通道
sync-channel-on-device-online: false
# 是否使用設(shè)備來(lái)源Ip作為回復(fù)IP, 不設(shè)置則為 false
sip-use-source-ip-as-remote-address: false
# 是否開啟sip日志
sip-log: true
# 自動(dòng)數(shù)據(jù)庫(kù)升級(jí),保證表結(jié)構(gòu)完整
sync-db: false
(6)編譯wvp
啟動(dòng)IntelliJ IDEA,打開wvp項(xiàng)目,開始編譯??吹匠霈F(xiàn)這樣的界面,表明編譯并且運(yùn)行成功。
編譯wvp
3.編譯zlm
(1)打開安裝好的Cmake,選擇zlm項(xiàng)目所在位置,并且選擇你build項(xiàng)目時(shí)的位置,這里我們就放在同一目錄下,方便管理。
選擇項(xiàng)目目錄和build目錄
下一步,點(diǎn)擊Yes
(2)點(diǎn)擊Configure
(3)點(diǎn)擊Genrate,可以看到兩個(gè)步驟都提示成功了。
(4)選擇打開項(xiàng)目,就會(huì)自動(dòng)打開Visual Studio 2017
打開項(xiàng)目
(5)這里我們直接可以按下圖**作,你也可以選擇Release
選擇之后點(diǎn)擊本地Windows調(diào)試器
(6)這里編譯需要一定時(shí)間,耐心等待。
編譯成功
(7)出現(xiàn)編譯完成的提示后,去項(xiàng)目目錄下找到Debug目錄或者Release目錄。目錄位置位于release目錄下
zlm應(yīng)用程序入口目錄
最終應(yīng)用程序
(8)這里我們不能直接點(diǎn)擊MediaServer.exe,需要對(duì)其進(jìn)行配置,我們?cè)谏弦粋€(gè)目錄,會(huì)看到一個(gè)config.ini文件,打開并將它**到MediaServer.exe所在目錄。當(dāng)然,你也可以直接打開MediaServer.exe,第二它也會(huì)在當(dāng)前目錄自動(dòng)生成一個(gè)config.ini文件,你打開config.ini進(jìn)去配置即可。
配置文件示例
(9)zlm配置文件詳細(xì)配置如下,開發(fā)者可根據(jù)自己的實(shí)際情況調(diào)整
#!!!!此配置文件為范例配置文件,意在告訴讀者,各個(gè)配置項(xiàng)的具體含義和作用,
#!!!!該配置文件在執(zhí)行cmake時(shí),會(huì)拷貝至release/${**作系統(tǒng)類型}/${編譯類型}(例如release/linux/Debug) 文件夾。
#!!!!該文件夾(release/${**作系統(tǒng)類型}/${編譯類型})同時(shí)也是可執(zhí)行程序生成目標(biāo)路徑,在執(zhí)行MediaServer進(jìn)程時(shí),它會(huì)默認(rèn)加載同目錄下的config.ini文件作為配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不會(huì)被MediaServer進(jìn)程加載,因?yàn)镸ediaServer進(jìn)程默認(rèn)加載的是release/${**作系統(tǒng)類型}/${編譯類型}/config.ini。
#!!!!當(dāng)然,你每次執(zhí)行cmake,該文件確實(shí)會(huì)被拷貝至release/${**作系統(tǒng)類型}/${編譯類型}/config.ini,
#!!!!但是一般建議你直接修改release/${**作系統(tǒng)類型}/${編譯類型}/config.ini文件,修改此文件一般不起作用,除非你運(yùn)行MediaServer時(shí)使用-c參數(shù)指定到此文件。
[api]
#是否調(diào)試http api,啟用調(diào)試后,會(huì)打印每次http請(qǐng)求的內(nèi)容和回復(fù)
apiDebug=1
#一些比較敏感的http api在訪問(wèn)時(shí)需要提供secret,否則無(wú)權(quán)限調(diào)用
#如果是通過(guò)127.0.0.1訪問(wèn),那么可以不提供secret
secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#截圖保存路徑根目錄,截圖通過(guò)http api(/index/api/getSnap)生成和獲取
snapRoot=./www/snap/
#默認(rèn)截圖圖片,在啟動(dòng)FFmpeg截圖后但是截圖還未生成時(shí),可以返回默認(rèn)的預(yù)設(shè)圖片
defaultSnap=./www/logo.png
[ffmpeg]
#FFmpeg可執(zhí)行程序路徑,支持相對(duì)路徑/絕對(duì)路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通過(guò)該模板可以設(shè)置再編碼的一些參數(shù)
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的命令,可以通過(guò)修改該配置改變截圖分辨率或質(zhì)量
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
log=./ffmpeg/ffmpeg.log
# 自動(dòng)重啟的時(shí)間(秒), 默認(rèn)為0, 也就是不自動(dòng)重啟. 主要是為了避免長(zhǎng)時(shí)間ffmpeg拉流導(dǎo)致的不同步現(xiàn)象
restart_sec=0
#轉(zhuǎn)協(xié)議相關(guān)開關(guān);如果addStreamProxy api和on_publish hook回復(fù)未指定轉(zhuǎn)協(xié)議參數(shù),則采用這些配置項(xiàng)
[protocol]
#轉(zhuǎn)協(xié)議時(shí),是否開啟幀級(jí)時(shí)間戳覆蓋
modify_stamp=0
#轉(zhuǎn)協(xié)議是否開啟音頻
enable_audio=1
#添加acc靜音音頻,在關(guān)閉音頻時(shí),此開關(guān)無(wú)效
add_mute_audio=1
#推流斷開后可以在超時(shí)時(shí)間內(nèi)重新連接上繼續(xù)推流,這樣播放器會(huì)接著播放。
#置0關(guān)閉此特性(推流斷開會(huì)導(dǎo)致立即斷開播放器)
#此參數(shù)不應(yīng)大于播放器超時(shí)時(shí)間;單位毫秒
continue_push_ms=15000
#是否開啟轉(zhuǎn)換為hls
enable_hls=1
#是否開啟MP4錄制
enable_mp4=0
#是否開啟轉(zhuǎn)換為rtsp/webrtc
enable_rtsp=1
#是否開啟轉(zhuǎn)換為rtmp/flv
enable_rtmp=1
#是否開啟轉(zhuǎn)換為http-ts/ws-ts
enable_ts=1
#是否開啟轉(zhuǎn)換為http-fmp4/ws-fmp4
enable_fmp4=1
#是否將mp4錄制當(dāng)做觀看者
mp4_as_player=0
#mp4切片大小,單位秒
mp4_max_second=3600
#mp4錄制保存路徑
mp4_save_path=./www
#hls錄制保存路徑
hls_save_path=./www
###### 以下是按需轉(zhuǎn)協(xié)議的開關(guān),在測(cè)試ZLMediaKit的接收推流性能時(shí),請(qǐng)把下面開關(guān)置1
###### 如果某種協(xié)議你用不到,你可以把以下開關(guān)置1以便節(jié)省資源(但是還是可以播放,只是第一個(gè)播放者體驗(yàn)稍微差點(diǎn)),
###### 如果某種協(xié)議你想獲取最好的用戶體驗(yàn),請(qǐng)置0(第一個(gè)播放者可以秒開,且不花屏)
#hls協(xié)議是否按需生成,如果hls.segNum配置為0(意味著hls錄制),那么hls將一直生成(不管此開關(guān))
hls_demand=0
#rtsp[s]協(xié)議是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協(xié)議是否按需生成
rtmp_demand=0
#http[s]-ts協(xié)議是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協(xié)議是否按需生成
fmp4_demand=0
[general]
#是否啟用虛擬主機(jī)
enableVhost=0
#播放器或推流器在斷開后會(huì)觸發(fā)hook.on_flow_report**(使用多少流量**),
#flowThreshold參數(shù)控制觸發(fā)hook.on_flow_report**閾值,使用流量超過(guò)該閾值后才觸發(fā),單位KB
flowThreshold=1024
#播放最多等待時(shí)間,單位毫秒
#播放在播放某個(gè)流時(shí),如果該流不存在,
#ZLMediaKit會(huì)最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個(gè)時(shí)間內(nèi),該流注冊(cè)成功,那么會(huì)立即返回播放器播放成功
#否則返回播放器未找到該流,該機(jī)制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個(gè)流無(wú)人觀看時(shí),觸發(fā)hook.on_stream_none_reader**的最大等待時(shí)間,單位毫秒
#在配合hook.on_stream_none_reader**時(shí),可以做到無(wú)人觀看自動(dòng)停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流**時(shí)如果斷流再重連成功是否刪除前一次的媒體流數(shù)據(jù),如果刪除將重新開始,
#如果不刪除將會(huì)接著上一次的數(shù)據(jù)繼續(xù)寫(錄制hls/mp4時(shí)會(huì)繼續(xù)在前一個(gè)文件后面寫)
resetWhenRePlay=1
#合并寫緩存大小(單位毫秒),合并寫指服務(wù)器緩存一定的數(shù)據(jù)后才會(huì)一次性寫入socket,這樣能提高性能,但是會(huì)提高延時(shí)
#開啟后會(huì)同時(shí)關(guān)閉TCP_NODELAY并開啟MSG_MORE
mergeWriteMS=0
#服務(wù)器唯一id,用于觸發(fā)hook時(shí)區(qū)別是哪臺(tái)服務(wù)器,
#這里需要修改成自己定義的,your_server_id只是提示你是你自己服務(wù)器的id
#很多新手看都不看就原封不動(dòng)的使用
mediaServerId=your_server_id
#最多等待未初始化的Track時(shí)間,單位毫秒,超時(shí)之后會(huì)忽略未初始化的Track
wait_track_ready_ms=10000
#如果流只有單Track,最多等待若干毫秒,超時(shí)后未收到其他Track的數(shù)據(jù),則認(rèn)為是單Track
#如果協(xié)議元數(shù)據(jù)有聲明特定track數(shù),那么無(wú)此等待時(shí)間
wait_add_track_ms=3000
#如果track未就緒,我們先緩存幀數(shù)據(jù),但是有最大個(gè)數(shù)限制,防止內(nèi)存溢出
unready_frame_cache=100
[hls]
#hls寫文件的buf大小,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#hls最大切片時(shí)間
segDur=2
#m3u8索引中,hls保留切片個(gè)數(shù)(實(shí)際保留切片個(gè)數(shù)大2~3個(gè))
#如果設(shè)置為0,則不刪除切片,而是保存為點(diǎn)播
segNum=3
#HLS切片從m3u8文件中移除后,繼續(xù)保留在磁盤上的個(gè)數(shù)
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls文件刪除延時(shí),單位秒,issue: #913
deleteDelaySec=10
#是否保留hls文件,此功能部分等效于segNum=0的情況
#不同的是這個(gè)保留不會(huì)在m3u8文件中體現(xiàn)
#0為不保留,不起作用
#1為保留,則不刪除hls文件,如果開啟此功能,注意磁盤大小,或者定期手動(dòng)清理hls文件
segKeep=0
[hook]
#在推流時(shí),如果url參數(shù)匹對(duì)admin_params,那么可以不經(jīng)過(guò)hook鑒權(quán)直接推流成功,播放時(shí)亦然
#該配置項(xiàng)的目的是為了開發(fā)者自己調(diào)試測(cè)試,該參數(shù)暴露后會(huì)有泄露隱私的安全隱患
admin_params=secret=hgfgfhky-m87t-p09u-ayth-u76tyred25cc
#是否啟用hook**,啟用后,推拉流都將進(jìn)行鑒權(quán)
enable=0
#播放器或推流器使用流量**,置空則關(guān)閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#訪問(wèn)http文件鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權(quán)**,置空則關(guān)閉鑒權(quán)
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權(quán)**,置空則關(guān)閉鑒權(quán)
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播放鑒權(quán)**,此**中比對(duì)rtsp的用戶名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權(quán)**,置空則關(guān)閉rtsp鑒權(quán)。rtsp播放鑒權(quán)還支持url方式鑒權(quán)
#建議開發(fā)者統(tǒng)一采用url參數(shù)方式鑒權(quán),rtsp用戶名密碼鑒權(quán)一般在設(shè)備上用的比較多
#開啟rtsp專屬鑒權(quán)后,將不再觸發(fā)on_play鑒權(quán)**
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠(yuǎn)程telnet調(diào)試鑒權(quán)**
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊(cè)或注銷**
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無(wú)人觀看流**,通過(guò)該**,可以選擇是否關(guān)閉無(wú)人觀看的流。配合general.streamNoneReaderDelayMS選項(xiàng)一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時(shí),未找到流**,通過(guò)配合hook.on_stream_none_reader**可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#服務(wù)器啟動(dòng)報(bào)告,可以用于服務(wù)器的崩潰重啟****
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server?;钌蠄?bào)
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#發(fā)送rtp(startSendRtp)被動(dòng)關(guān)閉時(shí)回調(diào)
on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped
#rtp server 超時(shí)未收到數(shù)據(jù)
on_rtp_server_timeout=https://127.0.0.1/index/hook/on_rtp_server_timeout
#hook api最大等待回復(fù)時(shí)間,單位秒
timeoutSec=10
#keepalive hook觸發(fā)間隔,單位秒,float類型
alive_interval=10.0
#hook通知失敗重試次數(shù),正整數(shù)。為0不重試,1時(shí)重試一次,以此類推
retry=1
#hook通知失敗重試延時(shí),單位秒,float型
retry_delay=3.0
[cluster]
#設(shè)置源站拉流url模板, 格式跟printf類似,第一個(gè)%s指定app,第二個(gè)%s指定stream_id,
#開啟集群模式后,on_stream_not_found和on_stream_none_reader hook將無(wú)效.
#溯源模式支持以下類型:
#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
#支持多個(gè)源站,不同源站通過(guò)分號(hào)(;)分隔
origin_url=
#溯源總超時(shí)時(shí)長(zhǎng),單位秒,float型;假如源站有3個(gè),那么單次溯源超時(shí)時(shí)間為timeout_sec除以3
#單次溯源超時(shí)時(shí)間不要超過(guò)general.maxStreamWaitMS配置
timeout_sec=15
#溯源失敗嘗試次數(shù),-1時(shí)**嘗試
retry_count=3
[http]
#http服務(wù)器字符編碼,windows上默認(rèn)gb2312
charSet=utf-8
#http鏈接超時(shí)時(shí)間
keepAliveSecond=30
#http請(qǐng)求體最大字節(jié)數(shù),如果post的body太大,則不適合緩存body在內(nèi)存
maxReqSize=40960
#404網(wǎng)頁(yè)內(nèi)容,用戶可以自定義404網(wǎng)頁(yè)
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您訪問(wèn)的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服務(wù)器**端口
port=80
#http文件服務(wù)器根目錄
#可以為相對(duì)(相對(duì)于本可執(zhí)行程序目錄)或絕對(duì)路徑
rootPath=./www
#http文件服務(wù)器讀文件緩存大小,單位BYTE,調(diào)整該參數(shù)可以優(yōu)化文件io性能
sendBufSize=65536
#https服務(wù)器**端口
sslport=443
#是否顯示文件夾菜單,開啟后可以瀏覽文件夾
dirMenu=1
#虛擬目錄, 虛擬目錄名和文件路徑使用","隔開,多個(gè)配置路徑間用";"隔開
#例如賦值為 app_a,/path/to/a;app_b,/path/to/b 那么
#訪問(wèn) http://127.0.0.1/app_a/file_a 對(duì)應(yīng)的文件路徑為 /path/to/a/file_a
#訪問(wèn) http://127.0.0.1/app_b/file_b 對(duì)應(yīng)的文件路徑為 /path/to/b/file_b
#訪問(wèn)其他http路徑,對(duì)應(yīng)的文件路徑還是在rootPath內(nèi)
virtualPath=
#禁止后綴的文件使用mmap緩存,使用“,”隔開
#例如賦值為 .mp4,.flv
#那么訪問(wèn)后綴為.mp4與.flv 的文件不緩存
forbidCacheSuffix=
#可以把http**前真實(shí)客戶端ip放在http頭中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否則可能導(dǎo)致偽造客戶端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點(diǎn)播的應(yīng)用名,通過(guò)限制應(yīng)用名,可以防止隨意點(diǎn)播
#點(diǎn)播的文件必須放置在此文件夾下
appName=record
#mp4錄制寫文件緩存,單位BYTE,調(diào)整參數(shù)可以提高文件io性能
fileBufSize=65536
#mp4點(diǎn)播每次流化數(shù)據(jù)量,單位毫秒,
#減少該值可以讓點(diǎn)播數(shù)據(jù)發(fā)送量更平滑,增大該值則更節(jié)省cpu資源
sampleMS=500
#mp4錄制完成后是否進(jìn)行二次關(guān)鍵幀索引寫入頭部
fastStart=0
#MP4點(diǎn)播(rtsp/rtmp/http-flv/ws-flv)是否循環(huán)播放文件
fileRepeat=0
[rtmp]
#rtmp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtmp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#在接收rtmp推流時(shí),是否重新生成時(shí)間戳(很多推流器的時(shí)間戳著實(shí)很爛)
modifyStamp=0
#rtmp服務(wù)器**端口
port=1935
#rtmps服務(wù)器**地址
sslport=0
[rtp]
#音頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
#加大該值會(huì)明顯增加直播延時(shí)
audioMtuSize=600
#視頻mtu大小,該參數(shù)限制rtp最大字節(jié)數(shù),推薦不要超過(guò)1400
videoMtuSize=1400
#rtp包最大長(zhǎng)度限制,單位KB,主要用于識(shí)別TCP上下文破壞時(shí),獲取到錯(cuò)誤的rtp
rtpMaxSize=10
# rtp 打包時(shí),低延遲開關(guān),默認(rèn)關(guān)閉(為0),h264存在一幀多個(gè)slice(NAL)的情況,在這種情況下,如果開啟可能會(huì)導(dǎo)致畫面花屏
lowLatency=0
[rtp_proxy]
#導(dǎo)出調(diào)試數(shù)據(jù)(包括rtp/ps/h264)至該目錄,置空則關(guān)閉數(shù)據(jù)導(dǎo)出
dumpDir=
#udp和tcp**服務(wù)器,支持rtp(必須是ts或ps類型)**
port=10000
#rtp超時(shí)時(shí)間,單位秒
timeoutSec=15
#隨機(jī)端口范圍,最少確保36個(gè)端口
#該范圍同時(shí)限制rtsp服務(wù)器udp端口范圍
port_range=30000-35000
#rtp h264 負(fù)載的pt
h264_pt=98
#rtp h265 負(fù)載的pt
h265_pt=99
#rtp ps 負(fù)載的pt
ps_pt=96
#rtp opus 負(fù)載的pt
opus_pt=100
[rtc]
#rtc播放推流、播放超時(shí)時(shí)間
timeoutSec=15
#本機(jī)對(duì)rtc客戶端的可見ip,作為服務(wù)器時(shí)一般為公網(wǎng)ip,可有多個(gè),用','分開,當(dāng)置空時(shí),會(huì)自動(dòng)獲取網(wǎng)卡ip
#同時(shí)支持環(huán)境變量,以$開頭,如"$EXTERN_IP"; 請(qǐng)參考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服務(wù)器**端口號(hào),所有rtc客戶端將通過(guò)該端口傳輸stun/dtls/srtp/srtcp數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
port=8000
#rtc tcp服務(wù)器**端口號(hào),在udp 不通的情況下,會(huì)使用tcp傳輸數(shù)據(jù)
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
#需要注意的是,如果服務(wù)器在nat內(nèi),需要做端口映射時(shí),必須確保外網(wǎng)映射端口跟該端口一致
tcpPort = 8000
#設(shè)置remb比特率,非0時(shí)關(guān)閉twcc并開啟remb。該設(shè)置在rtc推流時(shí)有效,可以控制推流畫質(zhì)
#目前已經(jīng)實(shí)現(xiàn)twcc自動(dòng)調(diào)整碼率,關(guān)閉remb根據(jù)真實(shí)網(wǎng)絡(luò)狀況調(diào)整碼率
rembBitRate=0
#rtc支持的音頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的音頻codec
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
#rtc支持的視頻codec類型,在前面的優(yōu)先級(jí)更高
#以下范例為所有支持的視頻codec
preferredCodecV=H264,H265,AV1,VP9,VP8
[srt]
#srt播放推流、播放超時(shí)時(shí)間,單位秒
timeoutSec=5
#srt udp服務(wù)器**端口號(hào),所有srt客戶端將通過(guò)該端口傳輸srt數(shù)據(jù),
#該端口是多線程的,同時(shí)支持客戶端網(wǎng)絡(luò)切換導(dǎo)致的連接遷移
port=9000
#srt 協(xié)議中延遲緩存的估算參數(shù),在握手階段估算rtt ,第二latencyMul*rtt 為最大緩存時(shí)長(zhǎng),此參數(shù)越大,表示等待重傳的時(shí)長(zhǎng)就越大
latencyMul=4
#包緩存的大小
pktBufSize=8192
[rtsp]
#rtsp專有鑒權(quán)方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流**是否是直接**模式
#直接**后支持任意編碼格式,但是會(huì)導(dǎo)致GOP緩存無(wú)法**到I幀,可能會(huì)導(dǎo)致開播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu會(huì)導(dǎo)致無(wú)法使用udp方式**
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接**的方式來(lái)支持rtsp**
#如果你是rtsp推拉流,但是webrtc播放,也建議關(guān)閉直接**模式,
#因?yàn)橹苯?*時(shí),rtp中可能沒(méi)有sps pps,會(huì)導(dǎo)致webrtc無(wú)法播放; 另外webrtc也不支持Single NAL Unit Packets類型rtp
#默認(rèn)開啟rtsp直接**,rtmp由于沒(méi)有這些問(wèn)題,是強(qiáng)制開啟直接**的
directProxy=1
#rtsp必須在此時(shí)間內(nèi)完成握手,否則服務(wù)器會(huì)斷開鏈接,單位秒
handshakeSecond=15
#rtsp超時(shí)時(shí)間,如果該時(shí)間內(nèi)未收到客戶端的數(shù)據(jù),
#或者tcp發(fā)送緩存超過(guò)這個(gè)時(shí)間,則會(huì)斷開連接,單位秒
keepAliveSecond=15
#rtsp服務(wù)器**地址
port=554
#rtsps服務(wù)器**地址
sslport=0
#rtsp 轉(zhuǎn)發(fā)是否使用低延遲模式,當(dāng)開啟時(shí),不會(huì)緩存rtp包,來(lái)提高并發(fā),可以降低一幀的延遲
lowLatency=0
[shell]
#調(diào)試telnet服務(wù)器接受最**ufffer大小
maxReqSize=1024
#調(diào)試telnet服務(wù)器**端口
port=0
(10)點(diǎn)擊MediaServer.exe啟動(dòng)zlm,出現(xiàn)如下界面,說(shuō)明啟動(dòng)成功。
4.運(yùn)行前端程序
(1)編譯程序
# 進(jìn)入前端目錄
cd wvp-GB28181-pro/web_src/
(2)運(yùn)行程序
# 本地運(yùn)行命令
npm run dev
出現(xiàn)這樣的提示說(shuō)明運(yùn)行成功
(3)出現(xiàn)上圖的提示說(shuō)明成功,在瀏覽器輸入http://127.0.0.1:8082,即可訪問(wèn)前端頁(yè)面
用戶登錄
(4)主頁(yè)看板展示
主頁(yè)看板
三、設(shè)備接入
(1)這里我們以大華攝像頭為例
攝像頭配置界面
(2)編輯好相應(yīng)參數(shù)后,點(diǎn)擊確定即可注冊(cè)到平臺(tái)。
設(shè)備注冊(cè)上平臺(tái)
(3)點(diǎn)播設(shè)備,測(cè)試是否正常拉流
通道信息
實(shí)際拉流效果
到這里zlm+wvp流媒體平臺(tái)搭建教程就結(jié)束了,對(duì)于新手的開發(fā)者,可以讓他們少走不少?gòu)澛罚脤⒏嗟臅r(shí)間用在二次開發(fā)和產(chǎn)品打磨上。本文不足和沒(méi)有涉及到的地方,歡迎留言指正!
最后附上我在此框架上二次開發(fā)的項(xiàng)目截圖,目前已經(jīng)運(yùn)用在實(shí)際項(xiàng)目中,有相關(guān)經(jīng)驗(yàn)開發(fā)者的可以留言交流。
首頁(yè)看板
視頻**
系統(tǒng)運(yùn)行情況
ps:最后感謝zlm框架和wvp框架作者,提供這么好的開源框架~
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.drmqd.com.cn/125218.html