使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果

使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供祁縣企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為祁縣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)的建站公司優(yōu)惠進(jìn)行中。

流程圖

使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果

?

1

2

3

4

5

6

7

1. 客戶端A無(wú)法進(jìn)行P2P穿透,請(qǐng)求業(yè)務(wù)服務(wù)器要進(jìn)行轉(zhuǎn)發(fā)。

2. 業(yè)務(wù)服務(wù)器根據(jù)客戶端A,請(qǐng)求類(lèi)型,返回對(duì)應(yīng)的轉(zhuǎn)發(fā)服務(wù)器地址和對(duì)應(yīng)的房間號(hào)RoomID/Token等信息

3. 上述請(qǐng)求類(lèi)型,可以是請(qǐng)求自建RTMP流媒體服務(wù),購(gòu)買(mǎi)于云廠商RTMP流媒體服務(wù)或者自定義協(xié)議媒體轉(zhuǎn)發(fā)服務(wù)

4. 客戶端A得到業(yè)務(wù)服務(wù)器返回的媒體服務(wù)器地址和RoomID/Token

5. 通過(guò)信令服務(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. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過(guò)上述信令或MQTT服務(wù)器進(jìn)行命令控制

1. 編譯Nginx

RTMP流媒體服務(wù)器,現(xiàn)成的開(kāi)源方案有很多,有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

?

1

--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段的定義。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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é)議的一些命令做了事件通知。這里我通過(guò)一個(gè)簡(jiǎn)單的SpringBoot項(xiàng)目,快速搭建一個(gè)HTTP服務(wù)來(lái)接收RTMP的回調(diào)。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

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打印信息(各位可以簡(jiǎn)單分析一下這些日志的)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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) 客戶端進(jìn)行推流,這里的推流軟件,我是使用這個(gè) http://www.iavcast.com/html/ruanjian/iavcast.html

使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果

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

使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果

(5) nginx-rtmp 日志

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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)如果有特殊性的,可以通過(guò)修改nginx-rtmp-module的源代碼,然后進(jìn)行修改,其實(shí)就是增加個(gè)auth函數(shù),這個(gè)函數(shù)可以查詢數(shù)據(jù)庫(kù)之類(lèi)的,然后決定返回0成功還是-1表示失敗。

除了上面說(shuō)到的方式,還可以通過(guò)簡(jiǎn)單的方式,就是上面提到的HTTP回調(diào)。如果HTTP回調(diào)返回的HTTP狀態(tài)碼是2xx的,表示成功。如果是返回5xx的狀態(tài)碼,那么表示失敗。那樣的話,服務(wù)器就是斷開(kāi)RTMP連接。

就是在 rtmp://rtmp.wunaozai.com/rtmp_live/room?username=username&password=password

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

6. 其他

這里是一些配置說(shuō)明和示例

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

Application 創(chuàng)建一個(gè)RTMP應(yīng)用,這里有點(diǎn)區(qū)別于http的location

Timeout 60s

stocket超時(shí),可以配合keepalive和ping值來(lái)實(shí)現(xiàn)不讓服務(wù)器端長(zhǎng)期處于監(jiān)聽(tīng)連接客戶端狀態(tài),實(shí)現(xiàn)快速關(guān)掉socket

Ping 3m

ping_timeout 30s

RTMP ping用于檢查活動(dòng)連接的協(xié)議。發(fā)送一個(gè)特殊的包遠(yuǎn)程連接,在ping_timeout指定時(shí)間內(nèi)期待一個(gè)回復(fù),如果沒(méi)有收到回復(fù),連接斷開(kāi)

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_queue

out_cork

Buflen 5s

設(shè)置默認(rèn)緩沖區(qū)長(zhǎng)度。通??蛻舳税l(fā)送播放前RTMP set_buflen命令并重置該設(shè)置

訪問(wèn)控制

Access

Allow/deny

允許來(lái)自指定地址或者所有地址發(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;

啟動(dòng)一些exec指令選項(xiàng),通過(guò)一些exec事件來(lái)干預(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

類(lèi)似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

指定與要在打開(kāi)事件執(zhí)行外部命令

Exec_play_done

指定要在打開(kāi)完成事件執(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

切換直播模式,即一對(duì)多廣播

Meta on/copy/off

奇幻發(fā)送元數(shù)據(jù)到客戶端 默認(rèn)on

Interleave on/off

切換交叉模式。在該模式下,音視頻會(huì)在同一個(gè)RTMPchunk流中傳輸。默認(rèn)為off

wait_key on|off

使視頻流從一個(gè)關(guān)鍵幀開(kāi)始,默認(rèn)為off

wait_video on|off

在一個(gè)視頻幀發(fā)送前禁用音頻。默認(rèn)off

通過(guò)wait_key/wait_video進(jìn)行組合以使客戶端可以收到具有所有其他數(shù)據(jù)的視頻關(guān)鍵幀。但這樣會(huì)增加連接延遲。不過(guò)可以通過(guò)編解碼器中調(diào)整關(guān)鍵幀間隔來(lái)減少延遲。

Publish_notify on

發(fā)送NetStream.Publish.Start和NetStream.Publish.Stop給用戶,默認(rèn)off

Drop_idle_publisher 10s

終止指定時(shí)間內(nèi)閑置(沒(méi)有音頻、視頻)的發(fā)布連接,默認(rèn)為off。注意這個(gè)僅僅對(duì)于發(fā)布模式的連接起作用(發(fā)送publish命令之后)

Sync 10ms

同步音視頻流。如果用戶帶寬不足以接收發(fā)布率,服務(wù)器會(huì)丟棄一些幀。這將導(dǎo)致同步問(wèn)題。當(dāng)時(shí)間戳差超過(guò)sync指定值,將會(huì)發(fā)送一個(gè)絕對(duì)幀來(lái)解決這個(gè)問(wèn)題,默認(rèn)為300ms

Play_restart off

使nginx-rtmp能夠在發(fā)布啟動(dòng)或者停止時(shí)發(fā)送NetStream.Play.Start 和 NetStrem.Play.Stop到每個(gè)用戶。如果關(guān)閉的話,那么每個(gè)用戶就只能在回放的開(kāi)始結(jié)束時(shí)收到該通知了。默認(rèn)為on

Record 模式

Record off|all|audio|video|keyframes|manual

切換錄制模式,流可以被記錄到flv文件

Off 不錄制

All 錄制音頻和視頻

Audio

Video

Keyframes 只錄制關(guān)鍵視頻幀

Manual 不自動(dòng)啟動(dòng)錄制,使用控制接口來(lái)進(jìn)行啟動(dòng)和停止

Record_path /tmp/rec

指定錄制的flv文件存放目錄

Record_suffix -%d-%b-%y-%T.flv

錄制后綴strftime格式

Record_unique on|off

是否添加時(shí)間戳到錄制文件,防止文件被覆蓋,默認(rèn)off

record_append on|off

切換文件附加模式。開(kāi)啟后,錄制時(shí)將新數(shù)據(jù)附加到舊文件后面。默認(rèn)off

record_lock on|off

鎖定文件,調(diào)用系統(tǒng)的fcntl

record_max_size 128K

設(shè)置錄制文件的最大值

Record_max_frames 2

設(shè)置每個(gè)錄制文件的視頻幀最大數(shù)量

Record_interval 1s/15m

在這個(gè)指令指定的時(shí)間之后重啟錄制。默認(rèn)off設(shè)置為0表示錄制中無(wú)延遲。如果record_unique為off時(shí)所有的記錄都會(huì)被寫(xiě)到同一個(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è)文件下載完后才開(kāi)始播放。同一個(gè)play可以播放多個(gè)視頻地址(用于負(fù)載)。MP4格式要在編解碼都被RTMP支持才可以播放。一般常見(jiàn)的就是H264/AAC

Application 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)/tmp

Play_local_path /tmp/videos;

Paly /tmp/videos http://localhost/videos

表示播放視頻,先播放本地緩存,如果沒(méi)有的話,從localhost/videos下載到本地/tmp/videos后,在進(jìn)行播放

Relay模式

Pull url [key=value]

創(chuàng)建pull中繼。主要是從遠(yuǎn)程服務(wù)器拉取流媒體。并進(jìn)行重新發(fā)布。

Url語(yǔ)法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么將會(huì)使用本地application名,如果找不到playpath那么久用當(dāng)前流名稱(chēng)。

參數(shù)如下(使用Key=Value方式)

app 明確application名

Name 捆綁到relay的bending流名稱(chēng)。如果為空,那么會(huì)使用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類(lèi)似,只是push推送發(fā)布流到遠(yuǎn)程服務(wù)器。

Push_reconnect 1s

在斷開(kāi)連接后,在push重新連接錢(qián)等待的時(shí)間,默認(rèn)3秒

Session_relay on;

切換會(huì)話relay模式。在這種情況下關(guān)閉時(shí)relay銷(xiāo)毀。

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)碼,連接斷開(kāi)。目前用來(lái)做簡(jiǎn)單的鑒權(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_publish

On_doone

On_play_done

On_publish_done

On_record_done

On_update

Notify_update_timeout

設(shè)置on_update回調(diào)時(shí)間

Notify_update_strict on|off

Notify_relay_redirect on

Notify_method get

設(shè)置HTTP方法通知,默認(rèn)是application/x-www-form-urlencodeed 的POST內(nèi)容類(lèi)型。有時(shí)候可能會(huì)需要GET方法,在nginx的http{}部分處理調(diào)用。在這種情況下可以使用arg_*變量去訪問(wèn)參數(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分段長(zhǎng)度,默認(rèn)5秒,這個(gè)跟直播延遲有比較大的影響

Hls_playlist_length 20m;

設(shè)置HLS播放列表長(zhǎng)度,默認(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)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)建指定的日志格式。日志格式看起來(lái)很像 nginx HTTP 日志格式。日志格式里支持的幾個(gè)變量有:

* connection - 連接數(shù)。

* remote_addr - 客戶端地址。

* app - application 名。

* name - 上一個(gè)流名。

* args - 上一個(gè)流播放/發(fā)布參數(shù)。

* flashver - 客戶端 flash 版本。

* swfurl - 客戶端 swf url。

* tcurl - 客戶端 tcUrl。

* pageurl - 客戶端頁(yè)面 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)off

Application hls{

Live on;

Hls on;

Hls_path /tmp/hls;

Hls_fragment 15s;

}

關(guān)于使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

原文鏈接:https://www.cnblogs.com/wunaozai/p/9427730.html

文章標(biāo)題:使用Nginx-rtmp怎么實(shí)現(xiàn)一個(gè)直播媒體實(shí)時(shí)流效果
URL地址:http://muchs.cn/article0/jcjdio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站策劃ChatGPT、建站公司、網(wǎng)站收錄網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)