亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網(wǎng)站 > Nginx > 正文

Nginx-rtmp實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果

2024-08-30 12:29:49
字體:
供稿:網(wǎng)友

0. 前言

  這段時(shí)間在搭建一個(gè)IPCamera項(xiàng)目服務(wù)器。視頻點(diǎn)對(duì)點(diǎn)通話,客戶端會(huì)查看設(shè)備端的音視頻實(shí)時(shí)流。為了省流量,是通過P2P進(jìn)行穿透。但是由于NAT設(shè)備的原因和IPV4的枯竭。有些設(shè)備是無法進(jìn)行點(diǎn)對(duì)點(diǎn)傳輸實(shí)時(shí)流。所以需要進(jìn)行服務(wù)器轉(zhuǎn)發(fā)。這里為了快速實(shí)現(xiàn)原型,同時(shí)參考現(xiàn)在主流的流媒體協(xié)議。發(fā)現(xiàn)很多使用的是RTMP協(xié)議。

  下圖是總體設(shè)計(jì)圖,為了整合多平臺(tái),會(huì)自建RTMP流媒體服務(wù)器和使用云廠商SaaS的RTMP流媒體服務(wù)。但是由于有時(shí)候會(huì)傳輸一些非流媒體數(shù)據(jù),需要傳輸一些二進(jìn)制文件,所以會(huì)需要自定義媒體轉(zhuǎn)發(fā)服務(wù)。

  以下是我實(shí)際項(xiàng)目中,用到的架構(gòu)實(shí)現(xiàn)流程圖。

Nginx,rtmp,直播媒體,實(shí)時(shí)流

 1. 客戶端A無法進(jìn)行P2P穿透,請(qǐng)求業(yè)務(wù)服務(wù)器要進(jìn)行轉(zhuǎn)發(fā)。 2. 業(yè)務(wù)服務(wù)器根據(jù)客戶端A,請(qǐng)求類型,返回對(duì)應(yīng)的轉(zhuǎn)發(fā)服務(wù)器地址和對(duì)應(yīng)的房間號(hào)RoomID/Token等信息 3. 上述請(qǐng)求類型,可以是請(qǐng)求自建RTMP流媒體服務(wù),購買于云廠商RTMP流媒體服務(wù)或者自定義協(xié)議媒體轉(zhuǎn)發(fā)服務(wù) 4. 客戶端A得到業(yè)務(wù)服務(wù)器返回的媒體服務(wù)器地址和RoomID/Token 5. 通過信令服務(wù)器或者M(jìn)QTT服務(wù)器,把對(duì)應(yīng)的媒體服務(wù)器地址和RoomID/Token告訴另一端客戶端B 6. 客戶端A和客戶端B同時(shí)進(jìn)入相同房間Room,客戶端A進(jìn)行推流,客戶端B進(jìn)行拉流 7. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或MQTT服務(wù)器進(jìn)行命令控制

1. 編譯Nginx

  RTMP流媒體服務(wù)器,現(xiàn)成的開源方案有很多,有SRS,Red5,wowoza,F(xiàn)MS等,我這里使用的是Nginx的rtmp插件實(shí)現(xiàn)實(shí)時(shí)流轉(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配置,這里就不進(jìn)行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹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插件實(shí)現(xiàn)了針對(duì)RTMP協(xié)議的一些命令做了事件通知。這里我通過一個(gè)簡單的SpringBoot項(xiàng)目,快速搭建一個(gè)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. 運(yùn)行效果

  (1) 啟動(dòng)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=connecton_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=liveon_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=roomon_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=roomon_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=roomon_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=connecton_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=liveon_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=roomon_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=roomon_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=roomon_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=roomon_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=roomon_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=roomon_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=roomon_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=connecton_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=12345on_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=12345on_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=12345on_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=roomon_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=connecton_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=12345on_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=12345on_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=12345on_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=roomon_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=connecton_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=12345on_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=12345on_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=12345on_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=connecton_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=12345on_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=roomon_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=12345on_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=roomon_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=12345on_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=12345on_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=roomon_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) 客戶端進(jìn)行推流,這里的推流軟件,我是使用這個(gè) http://www.iavcast.com/html/ruanjian/iavcast.html

Nginx,rtmp,直播媒體,實(shí)時(shí)流

  (4) 移動(dòng)端,我使用微信小程序里的 騰訊視頻云  這個(gè)小程序里面有RTMP測試

Nginx,rtmp,直播媒體,實(shí)時(shí)流

  (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)方式

   一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對(duì)RTMP進(jìn)行鑒權(quán)處理。鑒權(quán)如果有特殊性的,可以通過修改nginx-rtmp-module的源代碼,然后進(jìn)行修改,其實(shí)就是增加個(gè)auth函數(shù),這個(gè)函數(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

  至于實(shí)現(xiàn),這里暫時(shí)還沒有,其實(shí)就是在SpringBoot項(xiàng)目中對(duì)每個(gè)請(qǐng)求,判斷一下參數(shù)即可。如果后面有機(jī)會(huì)就詳細(xì)寫一下,關(guān)聯(lián)Redis數(shù)據(jù)庫,實(shí)現(xiàn)房間號(hào)功能。但是可能不會(huì)寫了,因?yàn)閷?shí)際上不難。就是整個(gè)流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點(diǎn)不好。博客最主要的還是提供思路。實(shí)際實(shí)現(xiàn)就應(yīng)該在項(xiàng)目中實(shí)現(xiàn)了。

6. 其他

  這里是一些配置說明和示例

 

Application 創(chuàng)建一個(gè)RTMP應(yīng)用,這里有點(diǎn)區(qū)別于http的locationTimeout 60s stocket超時(shí),可以配合keepalive和ping值來實(shí)現(xiàn)不讓服務(wù)器端長期處于監(jiān)聽連接客戶端狀態(tài),實(shí)現(xiàn)快速關(guān)掉socketPing 3mping_timeout 30sRTMP ping用于檢查活動(dòng)連接的協(xié)議。發(fā)送一個(gè)特殊的包遠(yuǎn)程連接,在ping_timeout指定時(shí)間內(nèi)期待一個(gè)回復(fù),如果沒有收到回復(fù),連接斷開max_streams 32設(shè)置RTMP流的最大數(shù)目,單一流數(shù)據(jù)最大限制,一般默認(rèn)的32就可以了ack_window 5000000設(shè)置RTMP窗口的大小chunk_size 4096數(shù)據(jù)塊大小 設(shè)置值越大CPU負(fù)載就越小max_queue最大隊(duì)列數(shù),一般默認(rèn)即可max_message 1M輸入數(shù)據(jù)消息的最大大小。所有輸入數(shù)據(jù)消息都會(huì)保存在內(nèi)存中,等待完成流媒體轉(zhuǎn)發(fā)。在理論上傳入的消息可以是非常大,對(duì)服務(wù)器穩(wěn)定性影響較大,所以一般默認(rèn)即可。out_queueout_corkBuflen 5s設(shè)置默認(rèn)緩沖區(qū)長度。通常客戶端發(fā)送播放前RTMP set_buflen命令并重置該設(shè)置訪問控制AccessAllow/deny允許來自指定地址或者所有地址發(fā)布/播放Allow public 127.0.0.1Deny publish all;Allow play 192.168.0.0/24Deny play all;Exec命令Exce exec_options on;啟動(dòng)一些exec指令選項(xiàng),通過一些exec事件來干預(yù)整個(gè)RTMP流可以仔細(xì)一些外部編解碼功能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_pushExec_publish指定與參數(shù)外部命令要在發(fā)布事件執(zhí)行。Exec_play指定與要在打開事件執(zhí)行外部命令Exec_play_done指定要在打開完成事件執(zhí)行外部命令Exec_publish_doneExec_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.mp4Live 模式Live on切換直播模式,即一對(duì)多廣播Meta on/copy/off奇幻發(fā)送元數(shù)據(jù)到客戶端 默認(rèn)onInterleave on/off切換交叉模式。在該模式下,音視頻會(huì)在同一個(gè)RTMPchunk流中傳輸。默認(rèn)為offwait_key on|off使視頻流從一個(gè)關(guān)鍵幀開始,默認(rèn)為offwait_video on|off在一個(gè)視頻幀發(fā)送前禁用音頻。默認(rèn)off通過wait_key/wait_video進(jìn)行組合以使客戶端可以收到具有所有其他數(shù)據(jù)的視頻關(guān)鍵幀。但這樣會(huì)增加連接延遲。不過可以通過編解碼器中調(diào)整關(guān)鍵幀間隔來減少延遲。Publish_notify on發(fā)送NetStream.Publish.Start和NetStream.Publish.Stop給用戶,默認(rèn)offDrop_idle_publisher 10s終止指定時(shí)間內(nèi)閑置(沒有音頻、視頻)的發(fā)布連接,默認(rèn)為off。注意這個(gè)僅僅對(duì)于發(fā)布模式的連接起作用(發(fā)送publish命令之后)Sync 10ms同步音視頻流。如果用戶帶寬不足以接收發(fā)布率,服務(wù)器會(huì)丟棄一些幀。這將導(dǎo)致同步問題。當(dāng)時(shí)間戳差超過sync指定值,將會(huì)發(fā)送一個(gè)絕對(duì)幀來解決這個(gè)問題,默認(rèn)為300msPlay_restart off使nginx-rtmp能夠在發(fā)布啟動(dòng)或者停止時(shí)發(fā)送NetStream.Play.Start 和 NetStrem.Play.Stop到每個(gè)用戶。如果關(guān)閉的話,那么每個(gè)用戶就只能在回放的開始結(jié)束時(shí)收到該通知了。默認(rèn)為onRecord 模式Record off|all|audio|video|keyframes|manual切換錄制模式,流可以被記錄到flv文件Off 不錄制All 錄制音頻和視頻AudioVideoKeyframes 只錄制關(guān)鍵視頻幀Manual 不自動(dòng)啟動(dòng)錄制,使用控制接口來進(jìn)行啟動(dòng)和停止Record_path /tmp/rec指定錄制的flv文件存放目錄Record_suffix -%d-%b-%y-%T.flv錄制后綴strftime格式Record_unique on|off是否添加時(shí)間戳到錄制文件,防止文件被覆蓋,默認(rèn)offrecord_append on|off切換文件附加模式。開啟后,錄制時(shí)將新數(shù)據(jù)附加到舊文件后面。默認(rèn)offrecord_lock on|off鎖定文件,調(diào)用系統(tǒng)的fcntlrecord_max_size 128K設(shè)置錄制文件的最大值Record_max_frames 2設(shè)置每個(gè)錄制文件的視頻幀最大數(shù)量Record_interval 1s/15m在這個(gè)指令指定的時(shí)間之后重啟錄制。默認(rèn)off設(shè)置為0表示錄制中無延遲。如果record_unique為off時(shí)所有的記錄都會(huì)被寫到同一個(gè)文件中。否則就會(huì)以時(shí)間戳區(qū)分在不同文件Record_notify on|off奇幻當(dāng)定義錄制啟動(dòng)或者停止文件時(shí)發(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)建錄制塊??梢栽趩蝹€(gè)application中創(chuàng)建多個(gè)記錄 。VOD媒體Play dir|http://loc 播放指定目錄或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整個(gè)文件下載完后才開始播放。同一個(gè)play可以播放多個(gè)視頻地址(用于負(fù)載)。MP4格式要在編解碼都被RTMP支持才可以播放。一般常見的就是H264/AACApplication vod{Play /var/flvs;}Application vod_http{Play http://localhost/vod;}Play_temp_path /www設(shè)置遠(yuǎn)程VOD文件完全下載之后復(fù)制于play_temp_path之后的路徑??罩档脑捊么斯δ?。Play_local_path dir在播放前設(shè)置遠(yuǎn)程存儲(chǔ)VOD文件路徑,默認(rèn)/tmpPlay_local_path /tmp/videos;Paly /tmp/videos http://localhost/videos表示播放視頻,先播放本地緩存,如果沒有的話,從localhost/videos下載到本地/tmp/videos后,在進(jìn)行播放Relay模式Pull url [key=value]創(chuàng)建pull中繼。主要是從遠(yuǎn)程服務(wù)器拉取流媒體。并進(jìn)行重新發(fā)布。Url語法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么將會(huì)使用本地application名,如果找不到playpath那么久用當(dāng)前流名稱。參數(shù)如下(使用Key=Value方式)app 明確application名Name 捆綁到relay的bending流名稱。如果為空,那么會(huì)使用application中所有本地流tcUrlpageUrlswfUrlflashVerplayPathLiveStartStopStaticPull rtmp://cdn.example.com/main/ch?id=1234 name=channel;Push url [key=value]與pull類似,只是push推送發(fā)布流到遠(yuǎn)程服務(wù)器。Push_reconnect 1s在斷開連接后,在push重新連接錢等待的時(shí)間,默認(rèn)3秒Session_relay on;切換會(huì)話relay模式。在這種情況下關(guān)閉時(shí)relay銷毀。Notify 模式這個(gè)功能主要是提供HTTP回調(diào)。當(dāng)發(fā)送一些連接操作是,一個(gè)HTTP請(qǐng)求異步發(fā)送。命令處理會(huì)被暫停掛起,知道它返回結(jié)果代碼。當(dāng)HTTP返回2xx成功狀態(tài)碼時(shí),RTMP會(huì)話繼續(xù)。3xx狀態(tài)碼會(huì)使RTMP重定向到另一個(gè)從HTTP返回頭獲取到的application,否則連接丟失。其他狀態(tài)碼,連接斷開。目前用來做簡單的鑒權(quán)。On_connect url設(shè)置HTTP連接回調(diào)。當(dāng)客戶分發(fā)連接命令時(shí)。例子: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ā)播放命令時(shí)。http {Location /redirect {Rewrite ^.*$ newname?permanent;}}Rtmp{Application myqpp{Live on;On_play http://localhost/redirect;}}On_publishOn_dooneOn_play_doneOn_publish_doneOn_record_doneOn_updateNotify_update_timeout設(shè)置on_update回調(diào)時(shí)間Notify_update_strict on|offNotify_relay_redirect onNotify_method get設(shè)置HTTP方法通知,默認(rèn)是application/x-www-form-urlencodeed 的POST內(nèi)容類型。有時(shí)候可能會(huì)需要GET方法,在nginx的http{}部分處理調(diào)用。在這種情況下可以使用arg_*變量去訪問參數(shù)。例如如果是method為get時(shí)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啟動(dòng)前就已經(jīng)存在。Hls_fragment 15s;設(shè)置HLS分段長度,默認(rèn)5秒,這個(gè)跟直播延遲有比較大的影響Hls_playlist_length 20m;設(shè)置HLS播放列表長度,默認(rèn)30秒。這個(gè)跟直播緩存有關(guān)。Hls_sync time設(shè)置HLS時(shí)間戳同步閾值。默認(rèn)2ms。這個(gè)功能防止由低分辨率RTMP(1KHz)轉(zhuǎn)換到高分辨率MPEG-TS(90KHz)之后出現(xiàn)的噪音。Hls_continuous on|off切換HLS連續(xù)模式,默認(rèn)off。Hls_nested on|off切換HLS嵌套模式。默認(rèn)off。Hls_cleanup on|off;切換HLS清理。默認(rèn)onAccessLog日志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 日志格式。日志格式里支持的幾個(gè)變量有:* connection - 連接數(shù)。* remote_addr - 客戶端地址。* app - application 名。* name - 上一個(gè)流名。* args - 上一個(gè)流播放/發(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é)束的本地時(shí)間。* session_time - 持續(xù)連接的秒數(shù)。* session_readable_time - 在可讀格式下的持續(xù)時(shí)間。默認(rèn)的日志格式叫做 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ù),默認(rèn)offApplication hls{Live on;Hls on;Hls_path /tmp/hls;Hls_fragment 15s;}

總結(jié)

以上所述是小編給大家介紹的Nginx-rtmp實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到服務(wù)器教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲丝袜av一区| 国产呦精品一区二区三区网站| 九九在线观看视频| av在线网址观看| 欧美高清在线视频观看不卡| 欧美片第一页| 国产精品成人一区二区不卡| 成年人网站91| 免费h视频在线观看| 九九久久精品一区| 成人区精品一区二区不卡| 精品在线免费观看视频| 日韩三级精品电影久久久| 天天爱天天做天天操| 亚洲天堂中文网| 精东影业在线观看| 久久国产手机看片| 久久99免费视频| 亚洲丁香日韩| 久久香蕉综合色一综合色88| 都市激情一区| 欧美国产激情18| 欧美电影一区二区| 50度灰在线观看| 欧美二区三区91| 久久精品在线免费观看| 最近2019年日本中文免费字幕| 亚欧美一区二区三区| 激情久久久久久| 蜜桃麻豆91| 免费高潮视频95在线观看网站| 中文字幕一区二区三区视频| 一本大道av伊人久久综合| 亚洲精品天堂网| 亚洲激情视频在线播放| 久久五月天婷婷| 中文在线√天堂| 亚洲图中文字幕| 午夜欧美大片免费观看| 久久riav二区三区| 免费的av电影| 色av成人天堂桃色av| 亚洲码国产岛国毛片在线| 主播大秀视频在线观看一区二区| 极品人妻一区二区三区| 78精品国产综合久久香蕉| 成人精品视频.| 亚洲精品在线观看www| 狠狠色丁香久久婷婷综合丁香| 九色porny丨国产首页在线| 亚洲欧美在线看| 欧美日韩成人免费| 26uuu精品一区二区在线观看| 国产亚洲精品女人久久久久久| 日本黄色三级大片| 五月综合激情在线| 国产大学生自拍视频| 2018中文字幕第一页| 亚洲最新在线视频| 色天天久久综合婷婷女18| 8848成人影院| 韩国三级大全久久网站| 国产精品国精产品一二| 91丨porny丨户外露出| 国产富婆一级全黄大片| 蜜桃av中文字幕| 国产日韩一区在线| 亚洲欧洲黄色网| www.成人在线| 欧美激情在线精品一区二区三区| aⅴ色国产欧美| 美脚丝袜脚交一区二区| 亚洲最大福利视频| 超薄肉色丝袜脚交一区二区| av毛片久久久久**hd| 亚洲福利专区| 无码人妻精品一区二区三区夜夜嗨| 天天av天天爱| 在线视频日本亚洲性| 97国产成人无码精品久久久| 伊人精品一区二区三区| 99国产精品自拍| 韩国自拍一区| 国产三级精品视频| 国产精品进线69影院| 久久夜色精品国产欧美乱极品| 国产精品视频yy9099| 在线播放/欧美激情| 激情影院在线| 亚洲爱爱天堂| 国产精品乱码妇女bbbb| 国产欧美日韩综合精品二区| 在线观看日韩www视频免费| 日韩欧美的一区| 公交车上扒开嫩j挺进去| 精品欧美一区二区久久| 亚洲丝袜美腿一区| 粉嫩蜜臀av国产精品网站| 久久香蕉视频网站| 亚洲欧美色图视频| 久久亚洲精品视频| 免费中国女人69xxxxx视频| 暖暖影院日本高清...免费| 精品黑人一区二区三区在线观看| 国产成人麻豆精品午夜在线| 国产一区二区av在线| 91九色丨porny丨国产jk| 最近看过的日韩成人| 欧美男男tv网站在线播放| 久久综合久中文字幕青草| 欧美日韩另类综合| 中文字幕日韩欧美一区二区三区| 66av国产| 久久mv成人精品亚洲动漫| 一区三区视频| 亚洲精品丝袜日韩| xf在线a精品一区二区视频网站| 日韩电影网址| 久久网一区二区| 亚洲午夜久久久久久久久电影网| 日韩中文字幕不卡视频| 无码人妻丰满熟妇区五十路| 国产精品第13页| 亚洲成人动漫一区| 国产日韩欧美中文字幕| 国产丝袜视频在线播放| 亚洲av人无码激艳猛片服务器| 亚洲日本aⅴ片在线观看香蕉| 免费不卡中文字幕在线| 久久精品中文字幕一区二区三区| 狠狠色噜噜狠狠狠8888米奇| www精品久久| 先锋欧美三级| 性色av蜜臀av| 日韩av在线看| www.爱爱.com| 久久女同互慰一区二区三区| 三级黄色片播放| 亚洲一区在线电影| 欧美一区二区免费观在线| 男人天堂网站在线| 亚洲激情 国产| 久久国内精品| 全彩无遮拦全彩口工漫画全彩| 国产日产一区二区三区| 久久综合网导航| 四虎成人精品在永久在线观看| 亚洲综合色丁香婷婷六月图片| 超碰一区二区| 在线视频cao| 亚洲淫成人影院| 日韩精品在线中文字幕| 国产调教在线观看| 午夜在线精品偷拍| av毛片在线| 在线成人中文字幕| 在线观看午夜看亚太视频| 麻豆网址在线观看| 天堂社区在线视频| 午夜精品一二三区| 日韩欧美三级| 亚洲男人的天堂在线aⅴ视频| 国产精品6666| 中国人xxxxx69免费视频| 欧美成人精精品一区二区频| 农民人伦一区二区三区| 一个色综合网站| 久久久久久国产精品无码| 一区二区三区无码高清视频| 永久免费看av| 羞羞视频网页| 免费看成年人视频在线观看| 亚洲天堂1区| 国内外成人在线| 国产精品色婷婷久久58| 日韩欧美影院| 亚洲熟女www一区二区三区| 亚洲精品视频啊美女在线直播| 久久99国产精品自在自在app| 国产视频www| 日韩啪啪电影网| 精品无码人妻一区二区免费蜜桃| 亚洲天堂色网站| 日本精品在线| 深田えいみ中文字幕99久久| 欧美久久久久久久久久久久久久| 91成人天堂久久成人| 99精品桃花视频在线观看| 成人免费短视频| 一代武则天秘史| 日韩午夜在线| 免费观看黄一级视频| 91成人福利在线| 欧美三级精品| 91亚洲自偷观看高清| 中文字幕欧美人与畜| 亚洲人亚洲人成电影网站色| 欧美日韩国产中文精品字幕自在自线| 国产成人自拍视频在线| 欧美日韩激情电影| 91啪九色porn原创视频在线观看| 亚洲最大最好的私人影剧院| 丁香花高清视频完整版在线观看| 一区二区三区四区在线免费视频| 粉嫩精品久久99综合一区| 全部免费毛片在线播放一个| www.九九热.com| 国产一区二区三区美女| 久久亚洲精品小早川怜子| 国产三级三级在线观看| 天天干天天爽| 色喇叭免费久久综合网| 国产毛片毛片毛片毛片毛片| 欧美粗暴jizz性欧美20| japanese色系久久精品| 日韩三级视频在线观看| 欧美极度另类性三渗透| av在线资源站| 粉嫩久久99精品久久久久久夜| 麻豆极品一区二区三区| 亚洲欧美日韩视频二区| 在线手机福利影院| 久久久久久12| 第一区免费在线观看| www亚洲精品| 成人av电影在线网| 激情久久免费视频| 视频在线观看一区二区| 欧美日韩亚洲一区二区| 午夜精品福利电影| 69久久久久| 国产亚洲精品久久久优势| 成人激情动漫在线观看| 欧美另类极限扩张| 在线观看日韩av先锋影音电影院| 欧美一区二区在线免费观看| 日本japanese极品少妇| 在线观看视频中文字幕| 亚洲国产日本| 欧美1—12sexvideos| 男女男精品视频网站| a级影片在线观看| 国产视频第一页| 情趣视频网站在线免费观看| 欧美男男激情freegay| 亚欧黄色av| 欧美日韩第一页| 中文字幕在线日本| 青青草原在线免费观看| 忘忧草在线日韩www影院| 最新国产一区二区| 黄色片免费在线观看| 老司机精品视频导航| 国产精品影视| 精品一区二区三区自拍图片区| 日本在线观看a| 一个色在线综合| 国产九色porn网址| 欧美激情自拍| 色婷婷av久久久久久久| 亚洲女同性videos| 欧美成人观看免费全部完小说| 国产精品日韩| 日本成人免费在线观看| 九九视频免费在线观看| 色噜噜狠狠成人网p站| 狠狠操天天操夜夜操| 综合激情网五月| 色婷婷av一区二区三区丝袜美腿| 欧美在线啊v一区| 欧美性在线观看| 日韩激情综合| 久久亚洲专区| 91美女在线观看| 黄色www在线观看| 欧美性猛交xxxx免费看久久| 日韩欧美高清在线播放| 亚洲黄色在线网站| 99se婷婷在线视频观看| 精品久久久久国产| 挪威xxxx性hd极品| 九九热爱视频精品视频| 欧美三级蜜桃2在线观看| 亚洲精品久久久久久久久久久久久久| 国产中文一区二区| 麻豆成人免费视频| 青青草精品毛片| 久久人人爽人人爽爽久久| 久久精品香蕉视频| 欧美三级午夜理伦三级中视频| 一区二区国产欧美| 日本成人xxx| 免费看黄裸体一级大秀欧美| 日韩精品视频免费专区在线播放| 写真福利精品福利在线观看| 日韩欧美在线视频日韩欧美在线视频| 欧美brazzers| 高端美女服务在线视频播放| 亚洲欧美丝袜中文综合| 在线激情av| 亚洲一区观看| 欧美高清精品一区二区| 日本中文字幕在线观看| 男男h黄动漫啪啪无遮挡软件| 欧美韩日一区二区三区四区| 国产黄网在线观看| 岛国视频一区免费观看| 8x拔播拔播x8国产精品| 亚洲精品毛片一区二区三区| 国产乱子伦精品视频| 精品免费视频.| 毛片大全在线观看| 免费永久在线观看黄网| 九七久久人人| 国产乱子伦精品| 黑人巨大国产9丨视频| 99久久人妻无码精品系列| 免费黄色特级片| 欧美日韩中文在线观看| 肉体视频在线| 天天干天天干天天| 曰韩精品一区二区| 国模冰冰炮一区二区| 欧美一区二区视频在线播放| 日本欧美国产在线| 日韩色av导航| 精品一区二区三区免费视频| 欧美日韩一区二区三区电影|