Nginx搭配RTMP
2020-11-01 • 预计阅读时间 2 分钟
2020-11-01 • 预计阅读时间 2 分钟
RTMP协
议是Real Time Message Protocol
(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。
这个协议最初是为了Flash
研发的,后续在长时间内称为了流媒体播放或者说是直播业务中的标准协议。国内如果你要做直播业务这个协议基本上是绕不开的。不过这些年随着HLS
协议的发展,还有大家对Flash
的围剿,RTMP
也逐渐要退出主流的市场了。
RTMP
本质上还是一种TCP
协议,在开始的时候对于这类服务能够使用负载均衡都点疑问。其实是可以使用F5
或者Nginx
来实现负载均衡的。
RTMP
服务器的选择比较尴尬,本身是Adobe
的服务,旗下也有对应的软件Adobe Media Server
。但是这个软件在国内是不提供服务的……联系了官方也不卖。
开源的方案有一个nginx-rtmp-module。如果轻量的使用的话,建议用这个。
此外真正需要自己搭建一个RTMP
服务的机会其实挺少的,一般现在做相关的业务基本上都会使用各大CDN
厂商提供的服务了。😂😂😂
在一般客户端的模式下,RTMP
一般为拉流的模式。这种情况下,CDN
肯定是必须的。但是如果不谈最外侧的这些,内部对于拉流的服务器也是可以做负载均衡。这里面有如下的集中方法:
F5
等负载均衡措施直接将后端的RTMP
服务器做负载均衡。Nginx
的stream
模块,当作一般的TCP
服务去处理就可以了、Nginx
的rtmp-module
这个也提供了代理RTMP
服务的功能。但是如果要做负载均衡的话,需要搭配上面的Stream
模块来实现了。rtmp {
server{
listen 1935;
application live {
live on;
record off;
push rtmp://a.rtmp.youtube.com/live2/[streamkeyfromyoutube];
}
}
}
通过nginx-rtmp-module是可以将RTMP
协议转换成HLS
协议的。
其实就是将视频流转换成了分段,然后通过m3u8来索引具体的文件信息。
rtmp {
server {
listen 1935;
application tv {
live on;
hls on;
hls_path /tmp/tv2;
hls_fragment 15s;
pull rtmp://tv2.example.com:443/root/new name=tv2;
}
}
}
http {
server {
listen 80;
location /tv2 {
alias /tmp/tv2;
}
}
}
HLS
开始和结束到是可以通过对应的地址是否为404
来判断。
RTMP
是没有明确的开始和结束的。在直播的时候,开始和结束只能通过另外的途径来判断了。CDN
的转HLS
服务会由于缓存的原因导致视频结束以后,文件还存在的情况。