内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

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

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

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

流程圖

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

?

1

2

3

4

5

6

7

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

?

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異步通知回調(diào)

   Nginx-rtmp-module插件實現(xiàn)了針對RTMP協(xié)議的一些命令做了事件通知。這里我通過一個簡單的SpringBoot項目,快速搭建一個HTTP服務(wù)來接收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. 運行效果

(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怎么實現(xiàn)一個直播媒體實時流效果

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

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

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

一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對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ù)即可。如果后面有機會就詳細(xì)寫一下,關(guān)聯(lián)redis數(shù)據(jù)庫,實現(xiàn)房間號功能。但是可能不會寫了,因為實際上不難。就是整個流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點不好。博客最主要的還是提供思路。實際實現(xiàn)就應(yīng)該在項目中實現(xiàn)了。

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 創(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ā)送一個特殊的包遠(yuǎn)程連接,在ping_timeout指定時間內(nèi)期待一個回復(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

最大隊列數(shù),一般默認(rèn)即可

max_message 1M

輸入數(shù)據(jù)消息的最大大小。所有輸入數(shù)據(jù)消息都會保存在內(nèi)存中,等待完成流媒體轉(zhuǎn)發(fā)。在理論上傳入的消息可以是非常大,對服務(wù)器穩(wěn)定性影響較大,所以一般默認(rèn)即可。

out_queue

out_cork

Buflen 5s

設(shè)置默認(rèn)緩沖區(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流

可以仔細(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_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ù)到客戶端 默認(rèn)on

Interleave on/off

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

wait_key on|off

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

wait_video on|off

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

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

Publish_notify on

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

Drop_idle_publisher 10s

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

Sync 10ms

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

Play_restart off

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

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

record_append on|off

切換文件附加模式。開啟后,錄制時將新數(shù)據(jù)附加到舊文件后面。默認(rèn)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

在這個指令指定的時間之后重啟錄制。默認(rèn)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可以播放多個視頻地址(用于負(fù)載)。MP4格式要在編解碼都被RTMP支持才可以播放。一般常見的就是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)程存儲VOD文件路徑,默認(rèn)/tmp

Play_local_path /tmp/videos;

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

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

Relay模式

Pull url [key=value]

創(chuàng)建pull中繼。主要是從遠(yuǎn)程服務(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ā)布流到遠(yuǎn)程服務(wù)器。

Push_reconnect 1s

在斷開連接后,在push重新連接錢等待的時間,默認(rèn)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方法通知,默認(rèn)是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分段長度,默認(rèn)5秒,這個跟直播延遲有比較大的影響

Hls_playlist_length 20m;

設(shè)置HLS播放列表長度,默認(rèn)30秒。這個跟直播緩存有關(guān)。

Hls_sync time

設(shè)置HLS時間戳同步閾值。默認(rèn)2ms。這個功能防止由低分辨率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)建指定的日志格式。日志格式看起來很像 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ù)時間。

默認(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怎么實現(xiàn)一個直播媒體實時流效果問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

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

文章標(biāo)題:使用Nginx-rtmp怎么實現(xiàn)一個直播媒體實時流效果
URL地址:http://m.rwnh.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)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
藁城市| 安新县| 武宁县| 沂源县| 武宣县| 若尔盖县| 怀安县| 甘肃省| 边坝县| 平安县| 杭州市| 合江县| 临猗县| 海兴县| 新余市| 阜平县| 桐庐县| 安宁市| 嵩明县| 德清县| 长沙县| 舟山市| 蓬莱市| 玛纳斯县| 壤塘县| 南雄市| 定州市| 凤山市| 纳雍县| 吴川市| 万安县| 肥东县| 汤阴县| 昂仁县| 黄陵县| 舟山市| 灵璧县| 曲松县| 独山县| 天柱县| 永仁县|