这两篇博客也是跟直播流媒体相关的(2019-11-08)

物联网架构成长之路(41)-直播流媒体入门(RTSP篇) https://www.cnblogs.com/wunaozai/p/11772060.html
物联网架构成长之路(42)-直播流媒体入门(RTMP篇) https://www.cnblogs.com/wunaozai/p/11772392.html

0. 前言

  这段时间在搭建一个IPCamera项目服务器。视频点对点通话,客户端会查看设备端的音视频实时流。为了省流量,是通过P2P进行穿透。但是由于NAT设备的原因和IPV4的枯竭。有些设备是无法进行点对点传输实时流。所以需要进行服务器转发。这里为了快速实现原型,同时参考现在主流的流媒体协议。发现很多使用的是RTMP协议。

  下图是总体设计图,为了整合多平台,会自建RTMP流媒体服务器和使用云厂商SaaS的RTMP流媒体服务。但是由于有时候会传输一些非流媒体数据,需要传输一些二进制文件,所以会需要自定义媒体转发服务。

  以下是我实际项目中,用到的架构实现流程图。

  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

  文末提供Windows版本已经编译好的exe下载

2. 配置Nginx.conf

  基本的nginx配置,这里就不进行介绍了,需要了解的可以参考我其他博客,里面有介绍。这里只介绍rtmp段的定义。

  1. rtmp{
  2. server{
  3. listen ;
  4. access_log logs/rtmp_access.log;
  5. on_connect http://127.0.0.1:8080/v1/rtmp/on_connect;
  6. application rtmp {
  7. live on;
  8. notify_method get;
  9. on_play http://127.0.0.1:8080/v1/rtmp/on_play;
  10. on_publish http://127.0.0.1:8080/v1/rtmp/on_publish;
  11. on_done http://127.0.0.1:8080/v1/rtmp/on_done;
  12. on_play_done http://127.0.0.1:8080/v1/rtmp/on_play_done;
  13. on_publish_done http://127.0.0.1:8080/v1/rtmp/on_publish_done;
  14. on_record_done http://127.0.0.1:8080/v1/rtmp/on_record_done;
  15. on_update http://127.0.0.1:8080/v1/rtmp/on_update;
  16. notify_update_timeout 10s;
  17. }
  18. application vod {
  19. play /opt/openresty/video;
  20. }
  21. }
  22. }

3. HTTP异步通知回调

  Nginx-rtmp-module插件实现了针对RTMP协议的一些命令做了事件通知。这里我通过一个简单的SpringBoot项目,快速搭建一个HTTP服务来接收RTMP的回调。

  1. package com.wunaozai.rtmp.notify.controller;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4.  
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. @RestController
  10. @RequestMapping(value="/v1/rtmp/")
  11. public class RTMPNotifyController {
  12.  
  13. @GetMapping(value="/on_connect")
  14. public String onConnect(HttpServletRequest request){
  15. debug(request, "on_connect");
  16. return "on_connect";
  17. }
  18. @GetMapping(value="/on_play")
  19. public String onPlay(HttpServletRequest request){
  20. debug(request, "on_play");
  21. return "on_play";
  22. }
  23. @GetMapping(value="/on_publish")
  24. public String onPublish(HttpServletRequest request){
  25. debug(request, "on_publish");
  26. return "on_publish";
  27. }
  28. @GetMapping(value="/on_done")
  29. public String onDone(HttpServletRequest request){
  30. debug(request, "on_done");
  31. return "on_done";
  32. }
  33. @GetMapping(value="/on_play_done")
  34. public String onPlayDone(HttpServletRequest request){
  35. debug(request, "on_play_done");
  36. return "on_play_done";
  37. }
  38. @GetMapping(value="/on_publish_done")
  39. public String onPublishDone(HttpServletRequest request){
  40. debug(request, "on_publish_done");
  41. return "on_publish_done";
  42. }
  43. @GetMapping(value="/on_record_done")
  44. public String onRecordDone(HttpServletRequest request){
  45. debug(request, "on_record_done");
  46. return "on_record_done";
  47. }
  48. @GetMapping(value="/on_update")
  49. public String onUpdate(HttpServletRequest request){
  50. debug(request, "on_update");
  51. return "on_update";
  52. }
  53.  
  54. private String debug(HttpServletRequest request, String action){
  55. String str = action + ": " + request.getRequestURI() + " " + request.getQueryString();
  56. System.out.println(str);
  57. return str;
  58. }
  59. }

4. 运行效果

  (1) 启动nginx和SpringBoot

  (2) 以下是SpringBoot打印信息(各位可以简单分析一下这些日志的)

  1. on_connect: /v1/rtmp/on_connect app=rtmp&flashver=FMLE/3.0%(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178269841&call=connect
  2. on_publish: /v1/rtmp/on_publish app=rtmp&flashver=FMLE/3.0%(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
  3. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=3999&name=room
  4. on_done: /v1/rtmp/on_done app=rtmp&flashver=FMLE/3.0%(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
  5. on_publish_done: /v1/rtmp/on_publish_done app=rtmp&flashver=FMLE/3.0%(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
  6. on_connect: /v1/rtmp/on_connect app=rtmp&flashver=FMLE/3.0%(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178305623&call=connect
  7. on_publish: /v1/rtmp/on_publish app=rtmp&flashver=FMLE/3.0%(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
  8. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=7296&name=room
  9. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=17248&name=room
  10. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=27328&name=room
  11. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=37280&name=room
  12. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=47296&name=room
  13. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=57312&name=room
  14. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=67264&name=room
  15. 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
  16. 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
  17. 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
  18. 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
  19. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=77344&name=room
  20. 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
  21. 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
  22. 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
  23. 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
  24. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=87360&name=room
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=97311&name=room
  32. 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&timestamp=105504&name=room&pass=12345
  33. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=107199&name=room
  34. 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
  35. 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
  36. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=117344&name=room
  37. on_update: /v1/rtmp/on_update app=rtmp&flashver=FMLE/3.0%(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&timestamp=122815&name=room

  (3) 客户端进行推流,这里的推流软件,我是使用这个 http://www.iavcast.com/html/ruanjian/iavcast.html

  (4) 移动端,我使用微信小程序里的 腾讯视频云  这个小程序里面有RTMP测试

  (5) nginx-rtmp 日志

  1. 113.74.127.195 [/Aug/::: +] PUBLISH "rtmp" "room" "" - "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 46s)
  2. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  3. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  4. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  5. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  6. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  7. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (12s)
  8. 113.74.127.195 [/Aug/::: +] PUBLISH "rtmp" "room" "" - "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 30s)
  9. 113.74.127.195 [/Aug/::: +] PUBLISH "rtmp" "room" "" - "" "FMLE/3.0 (compatible; FMSc/1.0)" (13s)
  10. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  11. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  12. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (4s)
  13. 113.74.127.195 [/Aug/::: +] PLAY "rtmp" "room" "pass=12345" - "" "" (17s)
  14. 113.74.127.195 [/Aug/::: +] PUBLISH "rtmp" "room" "" - "" "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. Application 创建一个RTMP应用,这里有点区别于httplocation
  2. Timeout 60s
  3. stocket超时,可以配合keepaliveping值来实现不让服务器端长期处于监听连接客户端状态,实现快速关掉socket
  4. Ping 3m
  5. ping_timeout 30s
  6. RTMP ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开
  7. max_streams
  8. 设置RTMP流的最大数目,单一流数据最大限制,一般默认的32就可以了
  9. ack_window
  10. 设置RTMP窗口的大小
  11. chunk_size
  12. 数据块大小 设置值越大CPU负载就越小
  13. max_queue
  14. 最大队列数,一般默认即可
  15. max_message 1M
  16. 输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对服务器稳定性影响较大,所以一般默认即可。
  17. out_queue
  18. out_cork
  19. Buflen 5s
  20. 设置默认缓冲区长度。通常客户端发送播放前RTMP set_buflen命令并重置该设置
  21.  
  22. 访问控制
  23. Access
  24. Allow/deny
  25. 允许来自指定地址或者所有地址发布/播放
  26. Allow public 127.0.0.1
  27. Deny publish all;
  28. Allow play 192.168.0.0/
  29. Deny play all;
  30.  
  31. Exec命令
  32. Exce
  33. exec_options on;
  34. 启动一些exec指令选项,通过一些exec事件来干预整个RTMP
  35. 可以仔细一些外部编解码功能
  36. 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;
  37. Exce_statc
  38. 类似exce,属于静态命令,不支持传递上下文参数
  39. Exec_kill_signal term;
  40. Exec_kill_signal user1;
  41. Exec_kill_signal ;
  42. Exec_pull
  43. Exec_push
  44. Exec_publish
  45. 指定与参数外部命令要在发布事件执行。
  46. Exec_play
  47. 指定与要在打开事件执行外部命令
  48. Exec_play_done
  49. 指定要在打开完成事件执行外部命令
  50. Exec_publish_done
  51. Exec_record_done
  52. 例子
  53. exec_play bash -c echo $addr $pageurl >> /tmp/clients
  54. Exec_publish base -c echo $addr $flashver >> /tmp/publishers
  55. 转录
  56. Exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar -ac -vcodec libx264 $dirname/$basename.mp4
  57.  
  58. Live 模式
  59. Live on
  60. 切换直播模式,即一对多广播
  61. Meta on/copy/off
  62. 奇幻发送元数据到客户端 默认on
  63. Interleave on/off
  64. 切换交叉模式。在该模式下,音视频会在同一个RTMPchunk流中传输。默认为off
  65. wait_key on|off
  66. 使视频流从一个关键帧开始,默认为off
  67. wait_video on|off
  68. 在一个视频帧发送前禁用音频。默认off
  69. 通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。
  70. Publish_notify on
  71. 发送NetStream.Publish.StartNetStream.Publish.Stop给用户,默认off
  72. Drop_idle_publisher 10s
  73. 终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后)
  74. Sync 10ms
  75. 同步音视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms
  76. Play_restart off
  77. 使nginx-rtmp能够在发布启动或者停止时发送NetStream.Play.Start NetStrem.Play.Stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on
  78.  
  79. Record 模式
  80. Record off|all|audio|video|keyframes|manual
  81. 切换录制模式,流可以被记录到flv文件
  82. Off 不录制
  83. All 录制音频和视频
  84. Audio
  85. Video
  86. Keyframes 只录制关键视频帧
  87. Manual 不自动启动录制,使用控制接口来进行启动和停止
  88. Record_path /tmp/rec
  89. 指定录制的flv文件存放目录
  90. Record_suffix -%d-%b-%y-%T.flv
  91. 录制后缀strftime格式
  92. Record_unique on|off
  93. 是否添加时间戳到录制文件,防止文件被覆盖,默认off
  94. record_append on|off
  95. 切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off
  96. record_lock on|off
  97. 锁定文件,调用系统的fcntl
  98. record_max_size 128K
  99. 设置录制文件的最大值
  100. Record_max_frames
  101. 设置每个录制文件的视频帧最大数量
  102. Record_interval 1s/15m
  103. 在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_uniqueoff时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件
  104. Record_notify on|off
  105. 奇幻当定义录制启动或者停止文件时发送NetStream.Record.StartNetStream.Record.Stop状态信息onStatus到发布者。
  106.  
  107. 应用
  108. Application rtmp{
  109. Live on;
  110. Record all;
  111. Record_path /var/rec;
  112.  
  113. Recorder audio{
  114. Record audio;
  115. Record_suffix .audio.flv;
  116. }
  117. Recorder chunked{
  118. Record all;
  119. Record_interval 15s;
  120. Record_path /var/rec/chunked;
  121. }
  122. }
  123. 创建录制块。可以在单个application中创建多个记录
  124.  
  125. VOD媒体
  126. Play dir|http://loc
  127. 播放指定目录或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整个文件下载完后才开始播放。同一个play可以播放多个视频地址(用于负载)。MP4格式要在编解码都被RTMP支持才可以播放。一般常见的就是H264/AAC
  128. Application vod{
  129. Play /var/flvs;
  130. }
  131. Application vod_http{
  132. Play http://localhost/vod;
  133. }
  134. Play_temp_path /www
  135. 设置远程VOD文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。
  136. Play_local_path dir
  137. 在播放前设置远程存储VOD文件路径,默认/tmp
  138. Play_local_path /tmp/videos;
  139. Paly /tmp/videos http://localhost/videos
  140. 表示播放视频,先播放本地缓存,如果没有的话,从localhost/videos下载到本地/tmp/videos后,在进行播放
  141.  
  142. Relay模式
  143. Pull url [key=value]
  144. 创建pull中继。主要是从远程服务器拉取流媒体。并进行重新发布。
  145. Url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。
  146. 参数如下(使用Key=Value方式)
  147. app 明确application
  148. Name 捆绑到relaybending流名称。如果为空,那么会使用application中所有本地流
  149. tcUrl
  150. pageUrl
  151. swfUrl
  152. flashVer
  153. playPath
  154. Live
  155. Start
  156. Stop
  157. Static
  158. Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel;
  159. Push url [key=value]
  160. pull类似,只是push推送发布流到远程服务器。
  161. Push_reconnect 1s
  162. 在断开连接后,在push重新连接钱等待的时间,默认3
  163. Session_relay on;
  164. 切换会话relay模式。在这种情况下关闭时relay销毁。
  165.  
  166. Notify 模式
  167. 这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当HTTP返回2xx成功状态码时,RTMP会话继续。3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。
  168. On_connect url
  169. 设置HTTP连接回调。当客户分发连接命令时。
  170. 例子:
  171. On_connect http://localhost/my_auth;
  172. Location /on_connect{
  173. If($arg_flashver != my_secret_flashver”){
  174. Rewrite ^.*$ fallback?permanent;
  175. }
  176. }
  177. On_play url
  178. 设置HTTP播放回调。分发客户分发播放命令时。
  179. http {
  180. Location /redirect {
  181. Rewrite ^.*$ newname?permanent;
  182. }
  183. }
  184. Rtmp{
  185. Application myqpp{
  186. Live on;
  187. On_play http://localhost/redirect;
  188. }
  189. }
  190. On_publish
  191. On_doone
  192. On_play_done
  193. On_publish_done
  194. On_record_done
  195. On_update
  196. Notify_update_timeout
  197. 设置on_update回调时间
  198. Notify_update_strict on|off
  199. Notify_relay_redirect on
  200. Notify_method get
  201. 设置HTTP方法通知,默认是application/x-www-form-urlencodeed POST内容类型。有时候可能会需要GET方法,在nginxhttp{}部分处理调用。在这种情况下可以使用arg_*变量去访问参数。
  202. 例如如果是methodget
  203. Location /on_play{
  204. If($arg_pageUrl ~* localhost){
  205. Return ;
  206. }
  207. Return ;
  208. }
  209.  
  210. HLS 模式
  211. Hls on|off
  212. 使application 切换HLS协议直播
  213. Hls_path /tmp/hls;
  214. 设置HLS播放列表和分段目录。这一目录必须在nginx启动前就已经存在。
  215. Hls_fragment 15s;
  216. 设置HLS分段长度,默认5秒,这个跟直播延迟有比较大的影响
  217. Hls_playlist_length 20m;
  218. 设置HLS播放列表长度,默认30秒。这个跟直播缓存有关。
  219. Hls_sync time
  220. 设置HLS时间戳同步阈值。默认2ms。这个功能防止由低分辨率RTMP(1KHz)转换到高分辨率MPEG-TS(90KHz)之后出现的噪音。
  221. Hls_continuous on|off
  222. 切换HLS连续模式,默认off
  223. Hls_nested on|off
  224. 切换HLS嵌套模式。默认off
  225. Hls_cleanup on|off;
  226. 切换HLS清理。默认on
  227.  
  228. AccessLog日志
  229. Access_log off|path [format_name]
  230. Log_format new_format $remote_addr’;
  231. Access_log logs/rtmp_access.log new_format;
  232. Log_format 指定日志格式
  233. 创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有:
  234. * connection - 连接数。
  235. * remote_addr - 客户端地址。
  236. * app - application 名。
  237. * name - 上一个流名。
  238. * args - 上一个流播放/发布参数。
  239. * flashver - 客户端 flash 版本。
  240. * swfurl - 客户端 swf url
  241. * tcurl - 客户端 tcUrl
  242. * pageurl - 客户端页面 url
  243. * command - 客户端发送的播放/发布命令:NONEPLAYPUBLISHPLAY+PUBLISH
  244. * bytes_sent - 发送到客户端的字节数。
  245. * bytes_received - 从客户端接收到的字节数。
  246. * time_local - 客户端连接结束的本地时间。
  247. * session_time - 持续连接的秒数。
  248. * session_readable_time - 在可读格式下的持续时间。
  249. 默认的日志格式叫做 combined。这里是这一格式的定义:
  250. $remote_addr [$time_local] $command "$app" "$name" "$args" - 
  251. $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)
  252.  
  253. Limits限制
  254. max_connections number;
  255. 设置rtmp引擎最大连接数,默认off
  256.  
  257. Application hls{
  258. Live on;
  259. Hls on;
  260. Hls_path /tmp/hls;
  261. Hls_fragment 15s;
  262. }

  由于开发是在Windows上完成的,所以需要有Windows环境,这样测试起来比较方便。发现一个很好的功能: https://github.com/illuspas/nginx-rtmp-win32

参考资料

  https://github.com/arut/nginx-rtmp-module

  https://blog.csdn.net/cui918/article/details/53540397

  https://www.cnblogs.com/zx-admin/p/5783523.html

  https://www.cnblogs.com/lidabo/p/7099501.html

  https://blog.csdn.net/wei389083222/article/details/78721074

Nginx-RTMP Windows二进制下载: https://files.cnblogs.com/files/wunaozai/nginx-rtmp-win32-master.rar

本文地址: https://www.cnblogs.com/wunaozai/p/9427730.html

Nginx-rtmp 直播媒体实时流实现的更多相关文章

  1. 三、直播整体流程 五、搭建Nginx+Rtmp直播流服务

    HTML5实现视频直播功能思路详解_html5教程技巧_脚本之家 https://m.jb51.net/html5/587215.html 三.直播整体流程 直播整体流程大致可分为: 视频采集端:可以 ...

  2. windows下流媒体nginx-rmtp-module服务器搭建及java程序调用fmpeg将rtsp转rtmp直播流【转】

    https://github.com/illuspas/nginx-rtmp-win32 http://bashell.sinaapp.com/archives/build-nginx-rtmp-mo ...

  3. 基于nginx的rtmp直播服务器(nginx-rtmp-module实现)

    首先,在搭建服务之前先了解下目前主流的几个直播协议: 1.RTMP: 实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播 ...

  4. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  5. 搭建rtmp直播流服务之1:使用nginx搭建rtmp直播流服务器(nginx-rtmp模块的安装以及rtmp直播流配置)

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) 一.方案简要 首先通过对开发方案的仔细研究(实时监控.流媒体.直播流方案的数据源-->协议转换-->服务器--&g ...

  6. iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

    最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助. 直播拉流功能: 这里使用了开源的IJKPlayer第三框架,ijk ...

  7. nginx开发(四)调用ffmpeg,搭建rtmp直播流。

    1: 修改conf文件,配置rtmp直播 打开usr/local/nginx/conf/nginx.conf,添加红色内容: rtmp {#rtmp点播配置    server {        li ...

  8. Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流

    Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流学习笔记 所需条件: nginx-rtmp-module(带rtmp模块) ,链接:https://link.jiansh ...

  9. Ubuntu中使用Nginx+rtmp搭建流媒体直播服务

    一.背景 本篇文章是继上一篇文章<Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务>文章而写,在上一篇文章中我们搭建了一个点播服务器,在此基础上我们再搭建一个直播服务器, ...

随机推荐

  1. 013 Spark中的资源调优

    1.平常的资源使用情况 2.官网 3.资源参数调优 cores memory JVM 4.具体参数 可以在--conf参数中给定资源配置相关信息(配置的一般是JVM的一些垃圾回收机制) --drive ...

  2. 类属性判断 hasattr getattr

  3. UVa140 Bandwidth 【最优性剪枝】

    题目链接:https://vjudge.net/contest/210334#problem/F  转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...

  4. Openvas安装

    Openvas简介 Openvas是开源的,是Nessus项目分支,用于管理目标系统的漏洞,检测目标网络或主机的安全性.它的评估能力来源于数万个漏洞测试程序,openvas 早起版本还有一个客户端,现 ...

  5. 11.1 正睿停课训练 Day14

    目录 2018.11.1 正睿停课训练 Day14 A 字符串 B 取数游戏(贪心) C 魔方(模拟) 考试代码 B C 2018.11.1 正睿停课训练 Day14 时间:3.5h 期望得分:100 ...

  6. BZOJ.2453.维护队列([模板]带修改莫队)

    题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...

  7. UVA.12230.Crossing Rivers(期望)

    题目链接 /* 到达一条河时,船在河中的位置是随机的,所以船到达岸边需要的时间在 0~2l/v 均匀分布,所以船到岸的期望为 (0+2l/v)/2 过河需要 l/v 的时间,所以过一条河总的期望为 ( ...

  8. 潭州课堂25班:Ph201805201 WEB 之 JS 第四课 (课堂笔记)

    JS 引入方式 在 HTML 中写入 写在 的标签里 <script> </script>推荐 放在 </body> 结束之前 <!DOCTYPE html& ...

  9. 宝塔Linux面板 5.1正式版永久免费

    宝塔Linux面板 5.1正式版永久免费2017/06/16 2分钟装好面板,一键管理服务器 Linux版请确保纯净系统安装(支持CentOS.Ubuntu.Debian.Fedora),Web端管理 ...

  10. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...