Nginx-rtmp實現(xiàn)直播媒體實時流效果
0. 前言
這段時間在搭建一個IPCamera項目服務(wù)器。視頻點對點通話,客戶端會查看設(shè)備端的音視頻實時流。為了省流量,是通過P2P進行穿透。但是由于NAT設(shè)備的原因和IPV4的枯竭。有些設(shè)備是無法進行點對點傳輸實時流。所以需要進行服務(wù)器轉(zhuǎn)發(fā)。這里為了快速實現(xiàn)原型,同時參考現(xiàn)在主流的流媒體協(xié)議。發(fā)現(xiàn)很多使用的是RTMP協(xié)議。
下圖是總體設(shè)計圖,為了整合多平臺,會自建RTMP流媒體服務(wù)器和使用云廠商SaaS的RTMP流媒體服務(wù)。但是由于有時候會傳輸一些非流媒體數(shù)據(jù),需要傳輸一些二進制文件,所以會需要自定義媒體轉(zhuǎn)發(fā)服務(wù)。
以下是我實際項目中,用到的架構(gòu)實現(xiàn)流程圖。
1. 客戶端A無法進行P2P穿透,請求業(yè)務(wù)服務(wù)器要進行轉(zhuǎn)發(fā)。 2. 業(yè)務(wù)服務(wù)器根據(jù)客戶端A,請求類型,返回對應(yīng)的轉(zhuǎn)發(fā)服務(wù)器地址和對應(yīng)的房間號RoomID/Token等信息 3. 上述請求類型,可以是請求自建RTMP流媒體服務(wù),購買于云廠商RTMP流媒體服務(wù)或者自定義協(xié)議媒體轉(zhuǎn)發(fā)服務(wù) 4. 客戶端A得到業(yè)務(wù)服務(wù)器返回的媒體服務(wù)器地址和RoomID/Token 5. 通過信令服務(wù)器或者MQTT服務(wù)器,把對應(yīng)的媒體服務(wù)器地址和RoomID/Token告訴另一端客戶端B 6. 客戶端A和客戶端B同時進入相同房間Room,客戶端A進行推流,客戶端B進行拉流 7. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或MQTT服務(wù)器進行命令控制
1. 編譯Nginx
RTMP流媒體服務(wù)器,現(xiàn)成的開源方案有很多,有SRS,Red5,wowoza,F(xiàn)MS等,我這里使用的是Nginx的rtmp插件實現(xiàn)實時流轉(zhuǎn)發(fā)。
下載 nginx-rtmp-module https://github.com/arut/nginx-rtmp-module
重新編譯nginx
--prefix=/opt/nginx --with-stream --with-http_ssl_module --with-stream_ssl_module --with-debug --add-module=../nginx-rtmp-module
2. 配置Nginx.conf
基本的nginx配置,這里就不進行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹rtmp段的定義。
rtmp{ server{ listen 8081; access_log logs/rtmp_access.log; on_connect http://127.0.0.1:8080/v1/rtmp/on_connect; application rtmp { live on; notify_method get; on_play http://127.0.0.1:8080/v1/rtmp/on_play; on_publish http://127.0.0.1:8080/v1/rtmp/on_publish; on_done http://127.0.0.1:8080/v1/rtmp/on_done; on_play_done http://127.0.0.1:8080/v1/rtmp/on_play_done; on_publish_done http://127.0.0.1:8080/v1/rtmp/on_publish_done; on_record_done http://127.0.0.1:8080/v1/rtmp/on_record_done; on_update http://127.0.0.1:8080/v1/rtmp/on_update; notify_update_timeout 10s; } application vod { play /opt/openresty/video; } } }
3. HTTP異步通知回調(diào)
Nginx-rtmp-module插件實現(xiàn)了針對RTMP協(xié)議的一些命令做了事件通知。這里我通過一個簡單的SpringBoot項目,快速搭建一個HTTP服務(wù)來接收RTMP的回調(diào)。
package com.wunaozai.rtmp.notify.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value="/v1/rtmp/") public class RTMPNotifyController { @GetMapping(value="/on_connect") public String onConnect(HttpServletRequest request){ debug(request, "on_connect"); return "on_connect"; } @GetMapping(value="/on_play") public String onPlay(HttpServletRequest request){ debug(request, "on_play"); return "on_play"; } @GetMapping(value="/on_publish") public String onPublish(HttpServletRequest request){ debug(request, "on_publish"); return "on_publish"; } @GetMapping(value="/on_done") public String onDone(HttpServletRequest request){ debug(request, "on_done"); return "on_done"; } @GetMapping(value="/on_play_done") public String onPlayDone(HttpServletRequest request){ debug(request, "on_play_done"); return "on_play_done"; } @GetMapping(value="/on_publish_done") public String onPublishDone(HttpServletRequest request){ debug(request, "on_publish_done"); return "on_publish_done"; } @GetMapping(value="/on_record_done") public String onRecordDone(HttpServletRequest request){ debug(request, "on_record_done"); return "on_record_done"; } @GetMapping(value="/on_update") public String onUpdate(HttpServletRequest request){ debug(request, "on_update"); return "on_update"; } private String debug(HttpServletRequest request, String action){ String str = action + ": " + request.getRequestURI() + " " + request.getQueryString(); System.out.println(str); return str; } }
4. 運行效果
(1) 啟動nginx和SpringBoot
(2) 以下是SpringBoot打印信息(各位可以簡單分析一下這些日志的)
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178269841&call=connect on_publish: /v1/rtmp/on_publish app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish&name=room&type=live on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=update_publish&time=10×tamp=3999&name=room on_done: /v1/rtmp/on_done app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=done&name=room on_publish_done: /v1/rtmp/on_publish_done app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish_done&name=room on_connect: /v1/rtmp/on_connect app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178305623&call=connect on_publish: /v1/rtmp/on_publish app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=publish&name=room&type=live on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=10×tamp=7296&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=20×tamp=17248&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=30×tamp=27328&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=40×tamp=37280&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=50×tamp=47296&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=60×tamp=57312&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=70×tamp=67264&name=room on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178380351&call=connect on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play_done&name=room&pass=12345 on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=done&name=room&pass=12345 on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=80×tamp=77344&name=room on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178388202&call=connect on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=done&name=room&pass=12345 on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play_done&name=room&pass=12345 on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=90×tamp=87360&name=room on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178396146&call=connect on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=done&name=room&pass=12345 on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play_done&name=room&pass=12345 on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178403666&call=connect on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=100×tamp=97311&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=update_play&time=10×tamp=105504&name=room&pass=12345 on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=110×tamp=107199&name=room on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=done&name=room&pass=12345 on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play_done&name=room&pass=12345 on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=120×tamp=117344&name=room on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=130×tamp=122815&name=room
(3) 客戶端進行推流,這里的推流軟件,我是使用這個 http://www.iavcast.com/html/ruanjian/iavcast.html
(4) 移動端,我使用微信小程序里的 騰訊視頻云 這個小程序里面有RTMP測試
(5) nginx-rtmp 日志
1 113.74.127.195 [05/Aug/2018:16:18:08 +0800] PUBLISH "rtmp" "room" "" - 2646572 687 "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 46s) 2 113.74.127.195 [05/Aug/2018:16:19:49 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s) 3 113.74.127.195 [05/Aug/2018:16:19:57 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s) 4 113.74.127.195 [05/Aug/2018:16:20:05 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s) 5 113.74.127.195 [05/Aug/2018:16:20:13 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s) 6 113.74.127.195 [05/Aug/2018:16:30:39 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 7 113.74.127.195 [05/Aug/2018:16:30:54 +0800] PLAY "rtmp" "room" "pass=12345" - 413 647163 "" "" (12s) 8 113.74.127.195 [05/Aug/2018:16:31:08 +0800] PUBLISH "rtmp" "room" "" - 4961955 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 30s) 9 113.74.127.195 [05/Aug/2018:23:06:47 +0800] PUBLISH "rtmp" "room" "" - 425763 529 "" "FMLE/3.0 (compatible; FMSc/1.0)" (13s) 10 113.74.127.195 [05/Aug/2018:23:08:29 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 11 113.74.127.195 [05/Aug/2018:23:08:37 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 12 113.74.127.195 [05/Aug/2018:23:08:45 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 13 113.74.127.195 [05/Aug/2018:23:09:05 +0800] PLAY "rtmp" "room" "pass=12345" - 413 926026 "" "" (17s) 14 113.74.127.195 [05/Aug/2018:23:09:30 +0800] PUBLISH "rtmp" "room" "" - 7061016 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (2m 20s)
5. RTMP鑒權(quán)方式
一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對RTMP進行鑒權(quán)處理。鑒權(quán)如果有特殊性的,可以通過修改nginx-rtmp-module的源代碼,然后進行修改,其實就是增加個auth函數(shù),這個函數(shù)可以查詢數(shù)據(jù)庫之類的,然后決定返回0成功還是-1表示失敗。
除了上面說到的方式,還可以通過簡單的方式,就是上面提到的HTTP回調(diào)。如果HTTP回調(diào)返回的HTTP狀態(tài)碼是2xx的,表示成功。如果是返回5xx的狀態(tài)碼,那么表示失敗。那樣的話,服務(wù)器就是斷開RTMP連接。
就是在 rtmp://rtmp.wunaozai.com/rtmp_live/room?username=username&password=password
至于實現(xiàn),這里暫時還沒有,其實就是在SpringBoot項目中對每個請求,判斷一下參數(shù)即可。如果后面有機會就詳細寫一下,關(guān)聯(lián)Redis數(shù)據(jù)庫,實現(xiàn)房間號功能。但是可能不會寫了,因為實際上不難。就是整個流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點不好。博客最主要的還是提供思路。實際實現(xiàn)就應(yīng)該在項目中實現(xiàn)了。
6. 其他
這里是一些配置說明和示例
Application 創(chuàng)建一個RTMP應(yīng)用,這里有點區(qū)別于http的location Timeout 60s stocket超時,可以配合keepalive和ping值來實現(xiàn)不讓服務(wù)器端長期處于監(jiān)聽連接客戶端狀態(tài),實現(xiàn)快速關(guān)掉socket Ping 3m ping_timeout 30s RTMP ping用于檢查活動連接的協(xié)議。發(fā)送一個特殊的包遠程連接,在ping_timeout指定時間內(nèi)期待一個回復(fù),如果沒有收到回復(fù),連接斷開 max_streams 32 設(shè)置RTMP流的最大數(shù)目,單一流數(shù)據(jù)最大限制,一般默認的32就可以了 ack_window 5000000 設(shè)置RTMP窗口的大小 chunk_size 4096 數(shù)據(jù)塊大小 設(shè)置值越大CPU負載就越小 max_queue 最大隊列數(shù),一般默認即可 max_message 1M 輸入數(shù)據(jù)消息的最大大小。所有輸入數(shù)據(jù)消息都會保存在內(nèi)存中,等待完成流媒體轉(zhuǎn)發(fā)。在理論上傳入的消息可以是非常大,對服務(wù)器穩(wěn)定性影響較大,所以一般默認即可。 out_queue out_cork Buflen 5s 設(shè)置默認緩沖區(qū)長度。通??蛻舳税l(fā)送播放前RTMP set_buflen命令并重置該設(shè)置 訪問控制 Access Allow/deny 允許來自指定地址或者所有地址發(fā)布/播放 Allow public 127.0.0.1 Deny publish all; Allow play 192.168.0.0/24 Deny play all; Exec命令 Exce exec_options on; 啟動一些exec指令選項,通過一些exec事件來干預(yù)整個RTMP流 可以仔細一些外部編解碼功能 Exec ffmpeg -i rtmp://localhost?src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv rtmp://localhost/hls/$name 2>> /var/log/ffmpeg-$name.log; Exce_statc 類似exce,屬于靜態(tài)命令,不支持傳遞上下文參數(shù) Exec_kill_signal term; Exec_kill_signal user1; Exec_kill_signal 3; Exec_pull Exec_push Exec_publish 指定與參數(shù)外部命令要在發(fā)布事件執(zhí)行。 Exec_play 指定與要在打開事件執(zhí)行外部命令 Exec_play_done 指定要在打開完成事件執(zhí)行外部命令 Exec_publish_done Exec_record_done 例子 exec_play bash -c “echo $addr $pageurl >> /tmp/clients” Exec_publish base -c “echo $addr $flashver >> /tmp/publishers” 轉(zhuǎn)錄 Exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4 Live 模式 Live on 切換直播模式,即一對多廣播 Meta on/copy/off 奇幻發(fā)送元數(shù)據(jù)到客戶端 默認on Interleave on/off 切換交叉模式。在該模式下,音視頻會在同一個RTMPchunk流中傳輸。默認為off wait_key on|off 使視頻流從一個關(guān)鍵幀開始,默認為off wait_video on|off 在一個視頻幀發(fā)送前禁用音頻。默認off 通過wait_key/wait_video進行組合以使客戶端可以收到具有所有其他數(shù)據(jù)的視頻關(guān)鍵幀。但這樣會增加連接延遲。不過可以通過編解碼器中調(diào)整關(guān)鍵幀間隔來減少延遲。 Publish_notify on 發(fā)送NetStream.Publish.Start和NetStream.Publish.Stop給用戶,默認off Drop_idle_publisher 10s 終止指定時間內(nèi)閑置(沒有音頻、視頻)的發(fā)布連接,默認為off。注意這個僅僅對于發(fā)布模式的連接起作用(發(fā)送publish命令之后) Sync 10ms 同步音視頻流。如果用戶帶寬不足以接收發(fā)布率,服務(wù)器會丟棄一些幀。這將導(dǎo)致同步問題。當(dāng)時間戳差超過sync指定值,將會發(fā)送一個絕對幀來解決這個問題,默認為300ms Play_restart off 使nginx-rtmp能夠在發(fā)布啟動或者停止時發(fā)送NetStream.Play.Start 和 NetStrem.Play.Stop到每個用戶。如果關(guān)閉的話,那么每個用戶就只能在回放的開始結(jié)束時收到該通知了。默認為on Record 模式 Record off|all|audio|video|keyframes|manual 切換錄制模式,流可以被記錄到flv文件 Off 不錄制 All 錄制音頻和視頻 Audio Video Keyframes 只錄制關(guān)鍵視頻幀 Manual 不自動啟動錄制,使用控制接口來進行啟動和停止 Record_path /tmp/rec 指定錄制的flv文件存放目錄 Record_suffix -%d-%b-%y-%T.flv 錄制后綴strftime格式 Record_unique on|off 是否添加時間戳到錄制文件,防止文件被覆蓋,默認off record_append on|off 切換文件附加模式。開啟后,錄制時將新數(shù)據(jù)附加到舊文件后面。默認off record_lock on|off 鎖定文件,調(diào)用系統(tǒng)的fcntl record_max_size 128K 設(shè)置錄制文件的最大值 Record_max_frames 2 設(shè)置每個錄制文件的視頻幀最大數(shù)量 Record_interval 1s/15m 在這個指令指定的時間之后重啟錄制。默認off設(shè)置為0表示錄制中無延遲。如果record_unique為off時所有的記錄都會被寫到同一個文件中。否則就會以時間戳區(qū)分在不同文件 Record_notify on|off 奇幻當(dāng)定義錄制啟動或者停止文件時發(fā)送NetStream.Record.Start和NetStream.Record.Stop狀態(tài)信息onStatus到發(fā)布者。 應(yīng)用 Application rtmp{ Live on; Record all; Record_path /var/rec; Recorder audio{ Record audio; Record_suffix .audio.flv; } Recorder chunked{ Record all; Record_interval 15s; Record_path /var/rec/chunked; } } 創(chuàng)建錄制塊??梢栽趩蝹€application中創(chuàng)建多個記錄 。 VOD媒體 Play dir|http://loc 播放指定目錄或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整個文件下載完后才開始播放。同一個play可以播放多個視頻地址(用于負載)。MP4格式要在編解碼都被RTMP支持才可以播放。一般常見的就是H264/AAC Application vod{ Play /var/flvs; } Application vod_http{ Play http://localhost/vod; } Play_temp_path /www 設(shè)置遠程VOD文件完全下載之后復(fù)制于play_temp_path之后的路徑??罩档脑捊么斯δ?。 Play_local_path dir 在播放前設(shè)置遠程存儲VOD文件路徑,默認/tmp Play_local_path /tmp/videos; Paly /tmp/videos http://localhost/videos 表示播放視頻,先播放本地緩存,如果沒有的話,從localhost/videos下載到本地/tmp/videos后,在進行播放 Relay模式 Pull url [key=value] 創(chuàng)建pull中繼。主要是從遠程服務(wù)器拉取流媒體。并進行重新發(fā)布。 Url語法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么將會使用本地application名,如果找不到playpath那么久用當(dāng)前流名稱。 參數(shù)如下(使用Key=Value方式) app 明確application名 Name 捆綁到relay的bending流名稱。如果為空,那么會使用application中所有本地流 tcUrl pageUrl swfUrl flashVer playPath Live Start Stop Static Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel; Push url [key=value] 與pull類似,只是push推送發(fā)布流到遠程服務(wù)器。 Push_reconnect 1s 在斷開連接后,在push重新連接錢等待的時間,默認3秒 Session_relay on; 切換會話relay模式。在這種情況下關(guān)閉時relay銷毀。 Notify 模式 這個功能主要是提供HTTP回調(diào)。當(dāng)發(fā)送一些連接操作是,一個HTTP請求異步發(fā)送。命令處理會被暫停掛起,知道它返回結(jié)果代碼。當(dāng)HTTP返回2xx成功狀態(tài)碼時,RTMP會話繼續(xù)。3xx狀態(tài)碼會使RTMP重定向到另一個從HTTP返回頭獲取到的application,否則連接丟失。其他狀態(tài)碼,連接斷開。目前用來做簡單的鑒權(quán)。 On_connect url 設(shè)置HTTP連接回調(diào)。當(dāng)客戶分發(fā)連接命令時。 例子: On_connect http://localhost/my_auth; Location /on_connect{ If($arg_flashver != “my_secret_flashver”){ Rewrite ^.*$ fallback?permanent; } } On_play url 設(shè)置HTTP播放回調(diào)。分發(fā)客戶分發(fā)播放命令時。 http { Location /redirect { Rewrite ^.*$ newname?permanent; } } Rtmp{ Application myqpp{ Live on; On_play http://localhost/redirect; } } On_publish On_doone On_play_done On_publish_done On_record_done On_update Notify_update_timeout 設(shè)置on_update回調(diào)時間 Notify_update_strict on|off Notify_relay_redirect on Notify_method get 設(shè)置HTTP方法通知,默認是application/x-www-form-urlencodeed 的POST內(nèi)容類型。有時候可能會需要GET方法,在nginx的http{}部分處理調(diào)用。在這種情況下可以使用arg_*變量去訪問參數(shù)。 例如如果是method為get時 Location /on_play{ If($arg_pageUrl ~* localhost){ Return 200; } Return 500; } HLS 模式 Hls on|off 使application 切換HLS協(xié)議直播 Hls_path /tmp/hls; 設(shè)置HLS播放列表和分段目錄。這一目錄必須在nginx啟動前就已經(jīng)存在。 Hls_fragment 15s; 設(shè)置HLS分段長度,默認5秒,這個跟直播延遲有比較大的影響 Hls_playlist_length 20m; 設(shè)置HLS播放列表長度,默認30秒。這個跟直播緩存有關(guān)。 Hls_sync time 設(shè)置HLS時間戳同步閾值。默認2ms。這個功能防止由低分辨率RTMP(1KHz)轉(zhuǎn)換到高分辨率MPEG-TS(90KHz)之后出現(xiàn)的噪音。 Hls_continuous on|off 切換HLS連續(xù)模式,默認off。 Hls_nested on|off 切換HLS嵌套模式。默認off。 Hls_cleanup on|off; 切換HLS清理。默認on AccessLog日志 Access_log off|path [format_name] Log_format new_format ‘$remote_addr'; Access_log logs/rtmp_access.log new_format; Log_format 指定日志格式 創(chuàng)建指定的日志格式。日志格式看起來很像 nginx HTTP 日志格式。日志格式里支持的幾個變量有: * connection - 連接數(shù)。 * remote_addr - 客戶端地址。 * app - application 名。 * name - 上一個流名。 * args - 上一個流播放/發(fā)布參數(shù)。 * flashver - 客戶端 flash 版本。 * swfurl - 客戶端 swf url。 * tcurl - 客戶端 tcUrl。 * pageurl - 客戶端頁面 url。 * command - 客戶端發(fā)送的播放/發(fā)布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。 * bytes_sent - 發(fā)送到客戶端的字節(jié)數(shù)。 * bytes_received - 從客戶端接收到的字節(jié)數(shù)。 * time_local - 客戶端連接結(jié)束的本地時間。 * session_time - 持續(xù)連接的秒數(shù)。 * session_readable_time - 在可讀格式下的持續(xù)時間。 默認的日志格式叫做 combined。這里是這一格式的定義: $remote_addr [$time_local] $command "$app" "$name" "$args" - $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time) Limits限制 max_connections number; 設(shè)置rtmp引擎最大連接數(shù),默認off Application hls{ Live on; Hls on; Hls_path /tmp/hls; Hls_fragment 15s; }
總結(jié)
以上所述是小編給大家介紹的Nginx-rtmp實現(xiàn)直播媒體實時流效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Unity3D游戲引擎實現(xiàn)在Android中打開WebView的實例
- unity3d發(fā)布apk在android虛擬機中運行的詳細步驟(unity3d導(dǎo)出android apk)
- Nginx搭建rtmp直播服務(wù)器實現(xiàn)代碼
- vue項目中播放rtmp視頻文件流的方法
- vue-video-player實現(xiàn)實時視頻播放方式(監(jiān)控設(shè)備-rtmp流)
- 詳解Ubuntu18.04下配置Nginx+RTMP+HLS+HTTPFLV服務(wù)器實現(xiàn)點播/直播/錄制功能
- 在Ubuntu 14 上安裝 Nginx-RTMP 流媒體服務(wù)器的教程
- 樹莓派使用python-librtmp實現(xiàn)rtmp推流h264的方法
- 在linux系統(tǒng)下安裝python librtmp包的實現(xiàn)方法
- nginx使用nginx-rtmp-module模塊實現(xiàn)直播間功能
- Mac上搭建nginx+rtmp直播服務(wù)器的步驟詳解
- Android實現(xiàn)Unity3D下RTMP推送的示例
相關(guān)文章
淺談Nginx10m+高并發(fā)內(nèi)核優(yōu)化詳解
這篇文章主要介紹了淺談Nginx10m+高并發(fā)內(nèi)核優(yōu)化詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03Nginx中IF語句實現(xiàn)數(shù)學(xué)比較功能
這篇文章主要介紹了Nginx中IF語句實現(xiàn)數(shù)學(xué)比較功能,即在Nginx中用if判斷數(shù)字大小,類似編程語言中的邏輯比較,需要的朋友可以參考下2015-02-02詳解nginx實現(xiàn)ssl反向代理實戰(zhàn)
本篇文章主要介紹了nginx實現(xiàn)ssl反向代理實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01Nginx解決vue項目服務(wù)器部署及跨域訪問后端詳解
跨域問題在前后端分離項目很常見,至于為什么會跨域,同源策略,百度各種博客都很詳細,這里不再介紹,這篇文章主要給大家介紹了關(guān)于Nginx解決vue項目服務(wù)器部署及跨域訪問后端的相關(guān)資料,需要的朋友可以參考下2022-11-11