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