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服务会由于缓存的原因导致视频结束以后,文件还存在的情况。