ZlmediaKit簡單使用


開源媒體服務器: ZlMediaKit

部署環境

  • 操作系統: centos el7

  • IP : 10.1.200.48

  • User: root

  • Password: 1

安裝編譯過程:

  1. 查看操作系統版本,centos6和centos7不一樣的方式進行不一樣的編譯過程

    $$ uname -r 或 uname -a
    

    如果是ubuntu直接使用ap-get按照wiki安裝即可,這里以centos el7為例。

  2. 由於zlmediakit使用的cxx11,官方說明是4.8以上的gcc即可,但是不同版本的centos使用4.8的gcc會出現各式各樣不一樣的問題,所以推薦使用5.4.0的gcc編譯鏈。

    • 依賴於ffmpeg進行轉碼以及推拉流
    • 依賴於x264庫進行H264/AVC的編碼格式的編解碼。(注:zlmedia支持H265編碼格式,雖然一般情況下H265的視頻關鍵幀大小為H264的1/3,但是由於不同設備廠商對於H265的實現不一樣,所以可能出現兼容性問題。)
    • 依賴於openssl進行rtmp以及相關協議的握手
    • 新版本的zlmedia支持webrtc。
  3. 安裝依賴:

    • 查看gcc版本: gcc -v, 如果版本不高,則需要更新gcc版本,大約一兩個小時。
    • 先編譯安裝x264,openssl,否則編譯出來的ffmpeg無法進行264的推拉流和編解碼。
    • 編譯過程:
    # 拉代碼
    git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
    # !必須進行,初始化所需要的子模塊
    git submodule update --init
    # 進入目錄預編譯
    ./configure
    # 編譯
    make -j8
    # 運行
    cd release/linux 
    ./MediaServer 
    
  4. 配置

[api]
#是否調試http api,啟用調試后,會打印每次http請求的內容和回復
apiDebug=1
#一些比較敏感的http api在訪問時需要提供secret,否則無權限調用
#如果是通過127.0.0.1訪問,那么可以不提供secret
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
#截圖保存路徑根目錄,截圖通過http api(/index/api/getSnap)生成和獲取
snapRoot=./www/snap/
#默認截圖圖片,在啟動FFmpeg截圖后但是截圖還未生成時,可以返回默認的預設圖片
defaultSnap=./www/logo.png

[ffmpeg]
#FFmpeg可執行程序絕對路徑
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通過該模板可以設置再編碼的一些參數
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截圖的命令,可以通過修改該配置改變截圖分辨率或質量
snap=%s -i %s -y -f mjpeg -t 0.001 %s
#FFmpeg日志的路徑,如果置空則不生成FFmpeg日志
#可以為相對(相對於本可執行程序目錄)或絕對路徑
log=./ffmpeg/ffmpeg.log

[general]
#是否啟用虛擬主機
enableVhost=0
#播放器或推流器在斷開后會觸發hook.on_flow_report事件(使用多少流量事件),
#flowThreshold參數控制觸發hook.on_flow_report事件閾值,使用流量超過該閾值后才觸發,單位KB
flowThreshold=1024
#播放最多等待時間,單位毫秒
#播放在播放某個流時,如果該流不存在,
#ZLMediaKit會最多讓播放器等待maxStreamWaitMS毫秒
#如果在這個時間內,該流注冊成功,那么會立即返回播放器播放成功
#否則返回播放器未找到該流,該機制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某個流無人觀看時,觸發hook.on_stream_none_reader事件的最大等待時間,單位毫秒
#在配合hook.on_stream_none_reader事件時,可以做到無人觀看自動停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流代理是否添加靜音音頻(直接拉流模式本協議無效)
addMuteAudio=1
#拉流代理時如果斷流再重連成功是否刪除前一次的媒體流數據,如果刪除將重新開始,
#如果不刪除將會接着上一次的數據繼續寫(錄制hls/mp4時會繼續在前一個文件后面寫)
resetWhenRePlay=1
#是否默認推流時轉換成hls,hook接口(on_publish)中可以覆蓋該設置
publishToHls=1
#是否默認推流時mp4錄像,hook接口(on_publish)中可以覆蓋該設置
publishToMP4=0
#合並寫緩存大小(單位毫秒),合並寫指服務器緩存一定的數據后才會一次性寫入socket,這樣能提高性能,但是會提高延時
#開啟后會同時關閉TCP_NODELAY並開啟MSG_MORE
mergeWriteMS=0
#全局的時間戳覆蓋開關,在轉協議時,對frame進行時間戳覆蓋
#該開關對rtsp/rtmp/rtp推流、rtsp/rtmp/hls拉流代理轉協議時生效
#會直接影響rtsp/rtmp/hls/mp4/flv等協議的時間戳
#同協議情況下不影響(例如rtsp/rtmp推流,那么播放rtsp/rtmp時不會影響時間戳)
modifyStamp=0
#服務器唯一id,用於觸發hook時區別是哪台服務器
mediaServerId=your_server_id
#轉協議是否全局開啟或關閉音頻
enable_audio=1

###### 以下是按需轉協議的開關,在測試ZLMediaKit的接收推流性能時,請把下面開關置1
###### 如果某種協議你用不到,你可以把以下開關置1以便節省資源(但是還是可以播放,只是第一個播放者體驗稍微差點),
###### 如果某種協議你想獲取最好的用戶體驗,請置0(第一個播放者可以秒開,且不花屏)

#hls協議是否按需生成,如果hls.segNum配置為0(意味着hls錄制),那么hls將一直生成(不管此開關)
hls_demand=0
#rtsp[s]協議是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv協議是否按需生成
rtmp_demand=0
#http[s]-ts協議是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4協議是否按需生成
fmp4_demand=0

[hls]
#hls寫文件的buf大小,調整參數可以提高文件io性能
fileBufSize=65536
#hls保存文件路徑
#可以為相對(相對於本可執行程序目錄)或絕對路徑
filePath=./www
#hls最大切片時間
segDur=2
#m3u8索引中,hls保留切片個數(實際保留切片個數大2~3個)
#如果設置為0,則不刪除切片,而是保存為點播
segNum=3
#HLS切片從m3u8文件中移除后,繼續保留在磁盤上的個數
segRetain=5
#是否廣播 ts 切片完成通知
broadcastRecordTs=0
#直播hls文件刪除延時,單位秒,issue: #913
deleteDelaySec=0

[hook]
#在推流時,如果url參數匹對admin_params,那么可以不經過hook鑒權直接推流成功,播放時亦然
#該配置項的目的是為了開發者自己調試測試,該參數暴露后會有泄露隱私的安全隱患
admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
#是否啟用hook事件,啟用后,推拉流都將進行鑒權
enable=0
#播放器或推流器使用流量事件,置空則關閉
on_flow_report=https://127.0.0.1/index/hook/on_flow_report
#訪問http文件鑒權事件,置空則關閉鑒權
on_http_access=https://127.0.0.1/index/hook/on_http_access
#播放鑒權事件,置空則關閉鑒權
on_play=https://127.0.0.1/index/hook/on_play
#推流鑒權事件,置空則關閉鑒權
on_publish=https://127.0.0.1/index/hook/on_publish
#錄制mp4切片完成事件
on_record_mp4=https://127.0.0.1/index/hook/on_record_mp4
# 錄制 hls ts 切片完成事件
on_record_ts=https://127.0.0.1/index/hook/on_record_ts
#rtsp播放鑒權事件,此事件中比對rtsp的用戶名密碼
on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth
#rtsp播放是否開啟專屬鑒權事件,置空則關閉rtsp鑒權。rtsp播放鑒權還支持url方式鑒權
#建議開發者統一采用url參數方式鑒權,rtsp用戶名密碼鑒權一般在設備上用的比較多
#開啟rtsp專屬鑒權后,將不再觸發on_play鑒權事件
on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm
#遠程telnet調試鑒權事件
on_shell_login=https://127.0.0.1/index/hook/on_shell_login
#直播流注冊或注銷事件
on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed
#無人觀看流事件,通過該事件,可以選擇是否關閉無人觀看的流。配合general.streamNoneReaderDelayMS選項一起使用
on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader
#播放時,未找到流事件,通過配合hook.on_stream_none_reader事件可以完成按需拉流
on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found
#服務器啟動報告,可以用於服務器的崩潰重啟事件監聽
on_server_started=https://127.0.0.1/index/hook/on_server_started
#server保活上報
on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive
#hook api最大等待回復時間,單位秒
timeoutSec=10
#keepalive hook觸發間隔,單位秒,float類型
alive_interval=10.0

[http]
#http服務器字符編碼,windows上默認gb2312
charSet=utf-8
#http鏈接超時時間
keepAliveSecond=30
#http請求體最大字節數,如果post的body太大,則不適合緩存body在內存
maxReqSize=40960
#404網頁內容,用戶可以自定義404網頁
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您訪問的資源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服務器監聽端口
port=80
#http文件服務器根目錄
#可以為相對(相對於本可執行程序目錄)或絕對路徑
rootPath=./www
#http文件服務器讀文件緩存大小,單位BYTE,調整該參數可以優化文件io性能
sendBufSize=65536
#https服務器監聽端口
sslport=443
#是否顯示文件夾菜單,開啟后可以瀏覽文件夾
dirMenu=1
#虛擬目錄, 虛擬目錄名和文件路徑使用","隔開,多個配置路徑間用";"隔開
#例如賦值為 app_a,/path/to/a;app_b,/path/to/b 那么
#訪問 http://127.0.0.1/app_a/file_a 對應的文件路徑為 /path/to/a/file_a
#訪問 http://127.0.0.1/app_b/file_b 對應的文件路徑為 /path/to/b/file_b
#訪問其他http路徑,對應的文件路徑還是在rootPath內
virtualPath=

[multicast]
#rtp組播截止組播ip地址
addrMax=239.255.255.255
#rtp組播起始組播ip地址
addrMin=239.0.0.0
#組播udp ttl
udpTTL=64

[record]
#mp4錄制或mp4點播的應用名,通過限制應用名,可以防止隨意點播
#點播的文件必須放置在此文件夾下
appName=record
#mp4錄制寫文件緩存,單位BYTE,調整參數可以提高文件io性能
fileBufSize=65536
#mp4錄制保存、mp4點播根路徑
#可以為相對(相對於本可執行程序目錄)或絕對路徑
filePath=./www
#mp4錄制切片時間,單位秒
fileSecond=3600
#mp4點播每次流化數據量,單位毫秒,
#減少該值可以讓點播數據發送量更平滑,增大該值則更節省cpu資源
sampleMS=500
#mp4錄制完成后是否進行二次關鍵幀索引寫入頭部
fastStart=0
#MP4點播(rtsp/rtmp/http-flv/ws-flv)是否循環播放文件
fileRepeat=0

[rtmp]
#rtmp必須在此時間內完成握手,否則服務器會斷開鏈接,單位秒
handshakeSecond=15
#rtmp超時時間,如果該時間內未收到客戶端的數據,
#或者tcp發送緩存超過這個時間,則會斷開連接,單位秒
keepAliveSecond=15
#在接收rtmp推流時,是否重新生成時間戳(很多推流器的時間戳着實很爛)
modifyStamp=0
#rtmp服務器監聽端口
port=1935
#rtmps服務器監聽地址
sslport=19350

[rtp]
#音頻mtu大小,該參數限制rtp最大字節數,推薦不要超過1400
#加大該值會明顯增加直播延時
audioMtuSize=600
#視頻mtu大小,該參數限制rtp最大字節數,推薦不要超過1400
videoMtuSize=1400
#rtp包最大長度限制,單位KB,主要用於識別TCP上下文破壞時,獲取到錯誤的rtp
rtpMaxSize=10

[rtp_proxy]
#導出調試數據(包括rtp/ps/h264)至該目錄,置空則關閉數據導出
dumpDir=
#udp和tcp代理服務器,支持rtp(必須是ts或ps類型)代理
port=10000
#rtp超時時間,單位秒
timeoutSec=15

[rtc]
#rtc播放推流、播放超時時間
timeoutSec=15
#本機對rtc客戶端的可見ip,作為服務器時一般為公網ip,置空時,會自動獲取網卡ip
externIP=
#設置remb比特率,非0時關閉twcc並開啟remb。該設置在rtc推流時有效,可以控制推流畫質
rembBitRate=1000000

[rtsp]
#rtsp專有鑒權方式是采用base64還是md5方式
authBasic=0
#rtsp拉流、推流代理是否是直接代理模式
#直接代理后支持任意編碼格式,但是會導致GOP緩存無法定位到I幀,可能會導致開播花屏
#並且如果是tcp方式拉流,如果rtp大於mtu會導致無法使用udp方式代理
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式來支持rtsp代理
#如果你是rtsp推拉流,但是rtc播放,也建議關閉直接代理模式,
#因為直接代理時,rtp中可能沒有sps pps,會導致rtc無法播放
#默認開啟rtsp直接代理,rtmp由於沒有這些問題,是強制開啟直接代理的
directProxy=1
#rtsp必須在此時間內完成握手,否則服務器會斷開鏈接,單位秒
handshakeSecond=15
#rtsp超時時間,如果該時間內未收到客戶端的數據,
#或者tcp發送緩存超過這個時間,則會斷開連接,單位秒
keepAliveSecond=15
#rtsp服務器監聽地址
port=554
#rtsps服務器監聽地址
sslport=322

[shell]
#調試telnet服務器接受最大bufffer大小
maxReqSize=1024
#調試telnet服務器監聽端口
port=9090

可選擇方案

  • Zlmedia+信令服務器wvp(慎重選擇,bug很多)。注: 所有設備的控制由信令服務器之間配合實現,ZlmediaKit的接口十分豐富,回調也十分豐富,但是主要還是用於實現一整個國標監控平台。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM