Nginx搭配RTMP

2020-11-01 • 预计阅读时间 2 分钟

RTMP介绍

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服务器做负载均衡。
  • Nginxstream模块,当作一般的TCP服务去处理就可以了、
  • Nginxrtmp-module这个也提供了代理RTMP服务的功能。但是如果要做负载均衡的话,需要搭配上面的Stream模块来实现了。
rtmp {
 server{
     listen 1935;

     application live {
           live on;
           record off;
           push rtmp://a.rtmp.youtube.com/live2/[streamkeyfromyoutube];
          }
    }
}  

RTMP转HLS

通过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服务会由于缓存的原因导致视频结束以后,文件还存在的情况。
  • 虽然可以负载均衡,但是一般情况下还是推荐使用主备的模式。
devnginx

wentao

写点代码,解决点问题。

利用Coding.net完成hugo的自动发布和部署

traefik单独端口转发