直播源码搭建教程之直播流媒体
直播源码搭建教程之直播流媒体
前言
这段时间在搭建一个IPCamera项目服务器。视频点对点通话,客户端会查看设备端的音视频实时流。为了省流量,是通过P2P进行穿透。但是由于NAT设备的原因和IPV4的枯竭。有些设备是无法进行点对点传输实时流。所以需要进行服务器转发。这里为了快速实现原型,同时参考现在主流的流媒体协议。发现很多使用的是RTMP协议。
下图是总体设计图,为了整合多平台,会自建RTMP流媒体服务器和使用云厂商SaaS的RTMP流媒体服务。但是由于有时候会传输一些非流媒体数据,需要传输一些二进制文件,所以会需要自定义媒体转发服务。
以下是我实际项目中,用到的架构实现流程图。
1 1. 客户端A无法进行P2P穿透,请求业务服务器要进行转发。 2 2. 业务服务器根据客户端A,请求类型,返回对应的转发服务器地址和对应的房间号RoomID/Token等信息 3 3. 上述请求类型,可以是请求自建RTMP流媒体服务,购买于云厂商RTMP流媒体服务或者自定义协议媒体转发服务 4 4. 客户端A得到业务服务器返回的媒体服务器地址和RoomID/Token 5 5. 通过信令服务器或者MQTT服务器,把对应的媒体服务器地址和RoomID/Token告诉另一端客户端B 6 6. 客户端A和客户端B同时进入相同房间Room,客户端A进行推流,客户端B进行拉流 7 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 8081;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%20(compatible%3B%20FMSc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178269841&call=connect2 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=live3 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=room4 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=room5 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=room6 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=connect7 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=live8 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=room9 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 10 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 11 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 12 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 13 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 14 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 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%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 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%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 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%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 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×tamp=105504&name=room&pass=12345 33 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 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%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 37 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
(4) 移动端,我使用微信小程序里的 腾讯视频云 这个小程序里面有RTMP测试
(5) nginx-rtmp 日志
1 113.74.127.195 [05/Aug/2018:16:18:08 +0800] PUBLISH "rtmp" "room" "" - 2646572 687 "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 46s)2 113.74.127.195 [05/Aug/2018:16:19:49 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)3 113.74.127.195 [05/Aug/2018:16:19:57 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)4 113.74.127.195 [05/Aug/2018:16:20:05 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)5 113.74.127.195 [05/Aug/2018:16:20:13 +0800] PLAY "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)6 113.74.127.195 [05/Aug/2018:16:30:39 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s)7 113.74.127.195 [05/Aug/2018:16:30:54 +0800] PLAY "rtmp" "room" "pass=12345" - 413 647163 "" "" (12s)8 113.74.127.195 [05/Aug/2018:16:31:08 +0800] PUBLISH "rtmp" "room" "" - 4961955 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (1m 30s)9 113.74.127.195 [05/Aug/2018:23:06:47 +0800] PUBLISH "rtmp" "room" "" - 425763 529 "" "FMLE/3.0 (compatible; FMSc/1.0)" (13s) 10 113.74.127.195 [05/Aug/2018:23:08:29 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 11 113.74.127.195 [05/Aug/2018:23:08:37 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 12 113.74.127.195 [05/Aug/2018:23:08:45 +0800] PLAY "rtmp" "room" "pass=12345" - 413 871 "" "" (4s) 13 113.74.127.195 [05/Aug/2018:23:09:05 +0800] PLAY "rtmp" "room" "pass=12345" - 413 926026 "" "" (17s) 14 113.74.127.195 [05/Aug/2018:23:09:30 +0800] PUBLISH "rtmp" "room" "" - 7061016 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (2m 20s)
5. RTMP鉴权方式
一般商用的话,为了防止被其他人使用和安全性考虑,所以需要对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应用,这里有点区别于http的location2 Timeout 60s 3 stocket超时,可以配合keepalive和ping值来实现不让服务器端长期处于监听连接客户端状态,实现快速关掉socket4 Ping 3m5 ping_timeout 30s6 RTMP ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开7 max_streams 328 设置RTMP流的最大数目,单一流数据最大限制,一般默认的32就可以了9 ack_window 500000010 设置RTMP窗口的大小11 chunk_size 409612 数据块大小 设置值越大CPU负载就越小13 max_queue14 最大队列数,一般默认即可15 max_message 1M16 输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对服务器稳定性影响较大,所以一般默认即可。17 out_queue18 out_cork19 Buflen 5s20 设置默认缓冲区长度。通常客户端发送播放前RTMP set_buflen命令并重置该设置21 22 访问控制23 Access24 Allow/deny25 允许来自指定地址或者所有地址发布/播放26 Allow public 127.0.0.127 Deny publish all;28 Allow play 192.168.0.0/2429 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 3;42 Exec_pull 43 Exec_push44 Exec_publish45 指定与参数外部命令要在发布事件执行。46 Exec_play47 指定与要在打开事件执行外部命令48 Exec_play_done49 指定要在打开完成事件执行外部命令50 Exec_publish_done51 Exec_record_done52 例子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 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp457 58 Live 模式59 Live on60 切换直播模式,即一对多广播61 Meta on/copy/off62 奇幻发送元数据到客户端 默认on63 Interleave on/off64 切换交叉模式。在该模式下,音视频会在同一个RTMPchunk流中传输。默认为off65 wait_key on|off66 使视频流从一个关键帧开始,默认为off67 wait_video on|off68 在一个视频帧发送前禁用音频。默认off69 通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。70 Publish_notify on71 发送NetStream.Publish.Start和NetStream.Publish.Stop给用户,默认off72 Drop_idle_publisher 10s73 终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后)74 Sync 10ms75 同步音视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms76 Play_restart off77 使nginx-rtmp能够在发布启动或者停止时发送NetStream.Play.Start 和 NetStrem.Play.Stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on78 79 Record 模式80 Record off|all|audio|video|keyframes|manual81 切换录制模式,流可以被记录到flv文件82 Off 不录制83 All 录制音频和视频84 Audio85 Video86 Keyframes 只录制关键视频帧87 Manual 不自动启动录制,使用控制接口来进行启动和停止88 Record_path /tmp/rec89 指定录制的flv文件存放目录90 Record_suffix -%d-%b-%y-%T.flv91 录制后缀strftime格式92 Record_unique on|off93 是否添加时间戳到录制文件,防止文件被覆盖,默认off94 record_append on|off95 切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off96 record_lock on|off97 锁定文件,调用系统的fcntl98 record_max_size 128K99 设置录制文件的最大值 100 Record_max_frames 2 101 设置每个录制文件的视频帧最大数量 102 Record_interval 1s/15m 103 在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_unique为off时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件 104 Record_notify on|off 105 奇幻当定义录制启动或者停止文件时发送NetStream.Record.Start和NetStream.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 143 Relay模式 144 Pull url [key=value] 145 创建pull中继。主要是从远程服务器拉取流媒体。并进行重新发布。 146 Url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。 147 参数如下(使用Key=Value方式) 148 app 明确application名 149 Name 捆绑到relay的bending流名称。如果为空,那么会使用application中所有本地流 150 tcUrl 151 pageUrl 152 swfUrl 153 flashVer 154 playPath 155 Live 156 Start 157 Stop 158 Static 159 Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel; 160 Push url [key=value] 161 与pull类似,只是push推送发布流到远程服务器。 162 Push_reconnect 1s 163 在断开连接后,在push重新连接钱等待的时间,默认3秒 164 Session_relay on; 165 切换会话relay模式。在这种情况下关闭时relay销毁。 166 167 Notify 模式 168 这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当HTTP返回2xx成功状态码时,RTMP会话继续。3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。 169 On_connect url 170 设置HTTP连接回调。当客户分发连接命令时。 171 例子: 172 On_connect http://localhost/my_auth; 173 Location /on_connect{ 174 If($arg_flashver != “my_secret_flashver”){ 175 Rewrite ^.*$ fallback?permanent; 176 } 177 } 178 On_play url 179 设置HTTP播放回调。分发客户分发播放命令时。 180 http { 181 Location /redirect { 182 Rewrite ^.*$ newname?permanent; 183 } 184 } 185 Rtmp{ 186 Application myqpp{ 187 Live on; 188 On_play http://localhost/redirect; 189 } 190 } 191 On_publish 192 On_doone 193 On_play_done 194 On_publish_done 195 On_record_done 196 On_update 197 Notify_update_timeout 198 设置on_update回调时间 199 Notify_update_strict on|off 200 Notify_relay_redirect on 201 Notify_method get 202 设置HTTP方法通知,默认是application/x-www-form-urlencodeed 的POST内容类型。有时候可能会需要GET方法,在nginx的http{}部分处理调用。在这种情况下可以使用arg_*变量去访问参数。 203 例如如果是method为get时 204 Location /on_play{ 205 If($arg_pageUrl ~* localhost){ 206 Return 200; 207 } 208 Return 500; 209 } 210 211 HLS 模式 212 Hls on|off 213 使application 切换HLS协议直播 214 Hls_path /tmp/hls; 215 设置HLS播放列表和分段目录。这一目录必须在nginx启动前就已经存在。 216 Hls_fragment 15s; 217 设置HLS分段长度,默认5秒,这个跟直播延迟有比较大的影响 218 Hls_playlist_length 20m; 219 设置HLS播放列表长度,默认30秒。这个跟直播缓存有关。 220 Hls_sync time 221 设置HLS时间戳同步阈值。默认2ms。这个功能防止由低分辨率RTMP(1KHz)转换到高分辨率MPEG-TS(90KHz)之后出现的噪音。 222 Hls_continuous on|off 223 切换HLS连续模式,默认off。 224 Hls_nested on|off 225 切换HLS嵌套模式。默认off。 226 Hls_cleanup on|off; 227 切换HLS清理。默认on 228 229 AccessLog日志 230 Access_log off|path [format_name] 231 Log_format new_format ‘$remote_addr’; 232 Access_log logs/rtmp_access.log new_format; 233 Log_format 指定日志格式 234 创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有: 235 * connection - 连接数。 236 * remote_addr - 客户端地址。 237 * app - application 名。 238 * name - 上一个流名。 239 * args - 上一个流播放/发布参数。 240 * flashver - 客户端 flash 版本。 241 * swfurl - 客户端 swf url。 242 * tcurl - 客户端 tcUrl。 243 * pageurl - 客户端页面 url。 244 * command - 客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。 245 * bytes_sent - 发送到客户端的字节数。 246 * bytes_received - 从客户端接收到的字节数。 247 * time_local - 客户端连接结束的本地时间。 248 * session_time - 持续连接的秒数。 249 * session_readable_time - 在可读格式下的持续时间。 250 默认的日志格式叫做 combined。这里是这一格式的定义: 251 $remote_addr [$time_local] $command "$app" "$name" "$args" - 252 $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time) 253 254 Limits限制 255 max_connections number; 256 设置rtmp引擎最大连接数,默认off 257 258 Application hls{ 259 Live on; 260 Hls on; 261 Hls_path /tmp/hls; 262 Hls_fragment 15s; 263 }
直播源码搭建教程之直播流媒体
本文转载自网络,感谢( 无脑仔的小明 )的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理
直播源码搭建教程之直播流媒体相关推荐
- 一个直播源码搭建教程,教你如何完成一个完整的直播
网上关于视频直播的资料还是挺多的,看了一些文章,自己也动手实践了下,写了这个直播源码搭建教程.主要有三个步骤:(1)NginxRTMP服务器搭建(2)视频录制推流器 (3)拉流器(播放器),有了这些就 ...
- 直播平台源码搭建教程盘点直播技术中的编解码、直播协议、网络传输与简单实现
直播平台源码搭建教程盘点直播技术中的编解码.直播协议.网络传输与简单实现 Live CheatSheet | 直播技术理论基础与实践概论 音视频直播的基本流程都是采集 → 编码推流 → 网络分发 → ...
- 直播源码搭建教程5 分钟完成(直播 + 分流 + 画面水印)
直播源码搭建教程5 分钟完成(直播 + 分流 + 画面水印) 部署运行 服务器 安装docker(Centos7,其他系统请发挥你的搜索功能) $ yum -y install docker #安装d ...
- 直播源码搭建教程,教你实现举报功能
直播源码是现在非常受欢迎的应用,拥有非常多的用户,但是用户变多,平台内容就不可控了,需要用户自发举报,维护平台信息健康,今天就是一个直播源码搭建教程,看看举报功能是怎样实现的. 一.后台接口 //us ...
- 直播源码搭建,手机直播源码开发
直播的大火从2016年一直烧到了2017年,搭建直播平台的技术--直播APP源码也渐渐浮出水面,在直播大火的现在,您是不是也想要一款独属于自己的直播平台呢?小编今天就教您搭一款简易直播平台. 一.前端 ...
- 直播源码搭建教程之在h5 video中的直播
直播源码搭建教程之在h5 video中的直播 直播越来越成为趋势,因为疫情的冲击,不管是直播带货还是直播教育等等,将线上模式推上了巅峰- 因为业务和兴趣关系,稍微研究了一下在H5中直播的相关知识. P ...
- 在找直播平台源码搭建教程?先看看这些吧
很多人都在找直播平台源码教程,但其实连一些基础知识都不知道,因此小编特地编辑了这份跟直播平台源码搭建相关知识,以供大家进行学习. 1.服务器的选择: 服务器是搭建直播平台唯一需要购买的硬件设备,通常会 ...
- 直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇)
直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇) 在当下移动直播火爆的年代,如果你曾经使用过移动端直播应用,相信会被里面那令人惊叹的礼物动画效果迷住,比如像下面这样的效果. ...
- 一对一聊天系统开发直播源码搭建方便你我他
你还在热衷观看直播或者从事直播吗?你了解的直播方式有多少种呢?一对多的直播市场让你感到麻木了吗?直播行业如火如荼,一对多显然不再是领导直播市场的佼佼者,那么直播行业的未来是什么呢?我们可以听业内人士讲 ...
最新文章
- mysql数据库优化命令_MySQL数据库优化总结
- 一种安全的static变量Get/Set方式
- asp.net控件本质
- 巴巴腾机器人怎么开机_【巴巴腾智能机器人使用】_摘要频道_什么值得买
- improvement不可数
- 【Linux】一步一步学Linux——nice命令(127)
- 数据库原理与应用(SQL Server)笔记 第六章 数据完整性
- 淮海工学院c语言试卷,淮海工学院操作系统期末考试试题A卷2010
- linux 脚本 DIST,shell 脚本判断linux 的发行版本
- linux ntfs硬盘自动挂,linux下查看所有硬盘分区+挂接NTFS磁盘/硬盘+自动挂接硬盘方法...
- XML NameSpace
- 来喽,来喽,Python 3.9正式版发布了~~~
- usb深度检查 清理_红桥区清理隔油池一般多少钱
- LINUX SAN 500G重新分区、格式化,后成功恢复数据90%
- uva 10803(floyd)
- 主板诊断卡代码含义及处理方法
- 计算机系统变慢的原因,计算机系统运行速度变慢4大原因
- 未来是现在的将来时,在社科院杜兰金融管理硕士项目酝酿灿烂的明天
- 哈工大计算机系统2022大作业:程序人生-Hello‘s P2P
- python locust在linux下的安装