中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Nginx-rtmp怎么實現一個直播媒體實時流效果

發布時間:2021-03-09 15:37:14 來源:億速云 閱讀:740 作者:Leah 欄目:服務器

使用Nginx-rtmp怎么實現一個直播媒體實時流效果?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

流程圖

使用Nginx-rtmp怎么實現一個直播媒體實時流效果

?

1

2

3

4

5

6

7

1. 客戶端A無法進行P2P穿透,請求業務服務器要進行轉發。

2. 業務服務器根據客戶端A,請求類型,返回對應的轉發服務器地址和對應的房間號RoomID/Token等信息

3. 上述請求類型,可以是請求自建RTMP流媒體服務,購買于云廠商RTMP流媒體服務或者自定義協議媒體轉發服務

4. 客戶端A得到業務服務器返回的媒體服務器地址和RoomID/Token

5. 通過信令服務器或者MQTT服務器,把對應的媒體服務器地址和RoomID/Token告訴另一端客戶端B

6. 客戶端A和客戶端B同時進入相同房間Room,客戶端A進行推流,客戶端B進行拉流

7. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或MQTT服務器進行命令控制

1. 編譯Nginx

  RTMP流媒體服務器,現成的開源方案有很多,有SRS,Red5,wowoza,FMS等,我這里使用的是Nginx的rtmp插件實現實時流轉發。

  下載 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配置,這里就不進行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹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異步通知回調

   Nginx-rtmp-module插件實現了針對RTMP協議的一些命令做了事件通知。這里我通過一個簡單的SpringBoot項目,快速搭建一個HTTP服務來接收RTMP的回調。

?

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. 運行效果

  (1) 啟動nginx和SpringBoot

  (2) 以下是SpringBoot打印信息(各位可以簡單分析一下這些日志的)

?

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

使用Nginx-rtmp怎么實現一個直播媒體實時流效果

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

使用Nginx-rtmp怎么實現一個直播媒體實時流效果

  (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鑒權方式

   一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對RTMP進行鑒權處理。鑒權如果有特殊性的,可以通過修改nginx-rtmp-module的源代碼,然后進行修改,其實就是增加個auth函數,這個函數可以查詢數據庫之類的,然后決定返回0成功還是-1表示失敗。

  除了上面說到的方式,還可以通過簡單的方式,就是上面提到的HTTP回調。如果HTTP回調返回的HTTP狀態碼是2xx的,表示成功。如果是返回5xx的狀態碼,那么表示失敗。那樣的話,服務器就是斷開RTMP連接。

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

  至于實現,這里暫時還沒有,其實就是在SpringBoot項目中對每個請求,判斷一下參數即可。如果后面有機會就詳細寫一下,關聯Redis數據庫,實現房間號功能。但是可能不會寫了,因為實際上不難。就是整個流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點不好。博客最主要的還是提供思路。實際實現就應該在項目中實現了。

6. 其他

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

?

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 創建一個RTMP應用,這里有點區別于http的location

Timeout 60s

stocket超時,可以配合keepalive和ping值來實現不讓服務器端長期處于監聽連接客戶端狀態,實現快速關掉socket

Ping 3m

ping_timeout 30s

RTMP ping用于檢查活動連接的協議。發送一個特殊的包遠程連接,在ping_timeout指定時間內期待一個回復,如果沒有收到回復,連接斷開

max_streams 32

設置RTMP流的最大數目,單一流數據最大限制,一般默認的32就可以了

ack_window 5000000

設置RTMP窗口的大小

chunk_size 4096

數據塊大小 設置值越大CPU負載就越小

max_queue

最大隊列數,一般默認即可

max_message 1M

輸入數據消息的最大大小。所有輸入數據消息都會保存在內存中,等待完成流媒體轉發。在理論上傳入的消息可以是非常大,對服務器穩定性影響較大,所以一般默認即可。

out_queue

out_cork

Buflen 5s

設置默認緩沖區長度。通常客戶端發送播放前RTMP set_buflen命令并重置該設置

訪問控制

Access

Allow/deny

允許來自指定地址或者所有地址發布/播放

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事件來干預整個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,屬于靜態命令,不支持傳遞上下文參數

Exec_kill_signal term;

Exec_kill_signal user1;

Exec_kill_signal 3;

Exec_pull

Exec_push

Exec_publish

指定與參數外部命令要在發布事件執行。

Exec_play

指定與要在打開事件執行外部命令

Exec_play_done

指定要在打開完成事件執行外部命令

Exec_publish_done

Exec_record_done

例子

exec_play bash -c “echo $addr $pageurl >> /tmp/clients

Exec_publish base -c “echo $addr $flashver >> /tmp/publishers

轉錄

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

奇幻發送元數據到客戶端 默認on

Interleave on/off

切換交叉模式。在該模式下,音視頻會在同一個RTMPchunk流中傳輸。默認為off

wait_key on|off

使視頻流從一個關鍵幀開始,默認為off

wait_video on|off

在一個視頻幀發送前禁用音頻。默認off

通過wait_key/wait_video進行組合以使客戶端可以收到具有所有其他數據的視頻關鍵幀。但這樣會增加連接延遲。不過可以通過編解碼器中調整關鍵幀間隔來減少延遲。

Publish_notify on

發送NetStream.Publish.Start和NetStream.Publish.Stop給用戶,默認off

Drop_idle_publisher 10s

終止指定時間內閑置(沒有音頻、視頻)的發布連接,默認為off。注意這個僅僅對于發布模式的連接起作用(發送publish命令之后)

Sync 10ms

同步音視頻流。如果用戶帶寬不足以接收發布率,服務器會丟棄一些幀。這將導致同步問題。當時間戳差超過sync指定值,將會發送一個絕對幀來解決這個問題,默認為300ms

Play_restart off

使nginx-rtmp能夠在發布啟動或者停止時發送NetStream.Play.Start 和 NetStrem.Play.Stop到每個用戶。如果關閉的話,那么每個用戶就只能在回放的開始結束時收到該通知了。默認為on

Record 模式

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

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

Off 不錄制

All 錄制音頻和視頻

Audio

Video

Keyframes 只錄制關鍵視頻幀

Manual 不自動啟動錄制,使用控制接口來進行啟動和停止

Record_path /tmp/rec

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

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

錄制后綴strftime格式

Record_unique on|off

是否添加時間戳到錄制文件,防止文件被覆蓋,默認off

record_append on|off

切換文件附加模式。開啟后,錄制時將新數據附加到舊文件后面。默認off

record_lock on|off

鎖定文件,調用系統的fcntl

record_max_size 128K

設置錄制文件的最大值

Record_max_frames 2

設置每個錄制文件的視頻幀最大數量

Record_interval 1s/15m

在這個指令指定的時間之后重啟錄制。默認off設置為0表示錄制中無延遲。如果record_unique為off時所有的記錄都會被寫到同一個文件中。否則就會以時間戳區分在不同文件

Record_notify on|off

奇幻當定義錄制啟動或者停止文件時發送NetStream.Record.Start和NetStream.Record.Stop狀態信息onStatus到發布者。

應用

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;

}

}

創建錄制塊。可以在單個application中創建多個記錄 。

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

設置遠程VOD文件完全下載之后復制于play_temp_path之后的路徑。空值的話禁用此功能。

Play_local_path dir

在播放前設置遠程存儲VOD文件路徑,默認/tmp

Play_local_path /tmp/videos;

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

表示播放視頻,先播放本地緩存,如果沒有的話,從localhost/videos下載到本地/tmp/videos后,在進行播放

Relay模式

Pull url [key=value]

創建pull中繼。主要是從遠程服務器拉取流媒體。并進行重新發布。

Url語法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么將會使用本地application名,如果找不到playpath那么久用當前流名稱。

參數如下(使用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推送發布流到遠程服務器。

Push_reconnect 1s

在斷開連接后,在push重新連接錢等待的時間,默認3秒

Session_relay on;

切換會話relay模式。在這種情況下關閉時relay銷毀。

Notify 模式

這個功能主要是提供HTTP回調。當發送一些連接操作是,一個HTTP請求異步發送。命令處理會被暫停掛起,知道它返回結果代碼。當HTTP返回2xx成功狀態碼時,RTMP會話繼續。3xx狀態碼會使RTMP重定向到另一個從HTTP返回頭獲取到的application,否則連接丟失。其他狀態碼,連接斷開。目前用來做簡單的鑒權。

On_connect url

設置HTTP連接回調。當客戶分發連接命令時。

例子:

On_connect http://localhost/my_auth;

Location /on_connect{

If($arg_flashver != “my_secret_flashver”){

Rewrite ^.*$ fallback?permanent;

}

}

On_play url

設置HTTP播放回調。分發客戶分發播放命令時。

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

設置on_update回調時間

Notify_update_strict on|off

Notify_relay_redirect on

Notify_method get

設置HTTP方法通知,默認是application/x-www-form-urlencodeed 的POST內容類型。有時候可能會需要GET方法,在nginx的http{}部分處理調用。在這種情況下可以使用arg_*變量去訪問參數。

例如如果是method為get時

Location /on_play{

If($arg_pageUrl ~* localhost){

Return 200;

}

Return 500;

}

HLS 模式

Hls on|off

使application 切換HLS協議直播

Hls_path /tmp/hls;

設置HLS播放列表和分段目錄。這一目錄必須在nginx啟動前就已經存在。

Hls_fragment 15s;

設置HLS分段長度,默認5秒,這個跟直播延遲有比較大的影響

Hls_playlist_length 20m;

設置HLS播放列表長度,默認30秒。這個跟直播緩存有關。

Hls_sync time

設置HLS時間戳同步閾值。默認2ms。這個功能防止由低分辨率RTMP(1KHz)轉換到高分辨率MPEG-TS(90KHz)之后出現的噪音。

Hls_continuous on|off

切換HLS連續模式,默認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 指定日志格式

創建指定的日志格式。日志格式看起來很像 nginx HTTP 日志格式。日志格式里支持的幾個變量有:

* connection - 連接數。

* remote_addr - 客戶端地址。

* app - application 名。

* name - 上一個流名。

* args - 上一個流播放/發布參數。

* flashver - 客戶端 flash 版本。

* swfurl - 客戶端 swf url。

* tcurl - 客戶端 tcUrl。

* pageurl - 客戶端頁面 url。

* command - 客戶端發送的播放/發布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。

* bytes_sent - 發送到客戶端的字節數。

* bytes_received - 從客戶端接收到的字節數。

* time_local - 客戶端連接結束的本地時間。

* session_time - 持續連接的秒數。

* session_readable_time - 在可讀格式下的持續時間。

默認的日志格式叫做 combined。這里是這一格式的定義:

$remote_addr [$time_local] $command "$app" "$name" "$args" -

$bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)

Limits限制

max_connections number;

設置rtmp引擎最大連接數,默認off

Application hls{

Live on;

Hls on;

Hls_path /tmp/hls;

Hls_fragment 15s;

}

關于使用Nginx-rtmp怎么實現一個直播媒體實時流效果問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柞水县| 张北县| 金山区| 青海省| 富锦市| 龙海市| 建德市| 缙云县| 高邑县| 石渠县| 九江市| 积石山| 怀柔区| 浪卡子县| 平南县| 鄱阳县| 深州市| 遵义市| 当阳市| 宁蒗| 肇州县| 黄梅县| 汉中市| 崇仁县| 西林县| 济源市| 青神县| 合阳县| 广灵县| 大化| 曲松县| 泸西县| 黄陵县| 汝州市| 桂东县| 东台市| 栖霞市| 集贤县| 阿拉善盟| 唐山市| 荣成市|