推流服务器搭建实战

前不久iriszero师傅写了一键乳糖莓片(RTMP)的Docker脚本

FROM ubuntu
MAINTAINER iriszero48 version: 0.1
RUN sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && \
 sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list
RUN apt-get update && apt-get -y install nginx libnginx-mod-rtmp
EXPOSE 1935
RUN echo "rtmp{server{listen 1935;chunk_size 4096;application live {live on;}}}" >> /etc/nginx/nginx.conf
CMD service nginx start && bash

https://github.com/iriszero48/Trash/blob/master/ubuntu18.04%20rtmp/Dockerfile

iriszero师傅比较偷懒,直接包管理libnginx-mod-rtmp,莫的感情。

今天我还是手动一下试一下,正常情0况下,我都是用宝塔管理,但是宝塔面板并不支持RTMP模块的安装。

首先去VULTR开一台机器并安装好宝塔

TIM截图20200213170113.png

进入宝塔界面后我们选择安装LNMP,由于我们是基于Nginx的推流,所以就只安装Nginx就好了。

TIM截图20200213170852.png

在安装的同时我们做一下准备工作,我们需要安装的模块是国人开发的nginx-http-flv-module ,可以说是nginx-rtmp-module的升级,我觉得还行。

TIM截图20200213171537.png

我们首先先创建一个站点,这里为了方便测试,就直接用IP访问,当网站创建好后,可以看到创建成功的页面,那么说明Nginx就安装好了,下一步我们来安装模块。

TIM截图20200213173046.png

TIM截图20200213173127.png

首先把模块下载下来并解压到 /opt/nginx-http-flv-module

我们在根目录下执行 /www/server/nginx/sbin/nginx -V 将./configure arguents:之后的内容复制到记事本备用

TIM截图20200213173431.png

宝塔面板安装的nginx源码位于/www/server/nginx/src

所以我们编译内容为(./configure 上一步记事本中的备用内容 --add-module=/opt/nginx-http-flv-module)

./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/opt/nginx-http-flv-module

切换到/www/server/nginx/src目录并执行上面的代码,整个过程很快就能完成,当出现下面这些的时候,就可以继续下一步了。

TIM截图20200213174426.png

再执行make,千万不要执行make install 切记切记!

make完成后将系统中原有的nginx用重新编译生成的nginx文件替换,替换后重启nginx使新编译nginx生效

rm -rf /www/server/nginx/sbin/nginx
cp objs/nginx /www/server/nginx/sbin/
service nginx restart

至此我们就得到了一个推流服务器了,但不到我们还需要小小地配置一下才能使用。

根据官方给出的nginx配置和自己的需求改一下配置然后重启一下就行了。

worker_processes  1; #运行在Windows上时,设置为1,因为Windows不支持Unix domain socket
#worker_processes  auto; #1.3.8和1.2.5以及之后的版本

#worker_cpu_affinity  0001 0010 0100 1000; #只能用于FreeBSD和Linux
#worker_cpu_affinity  auto; #1.9.10以及之后的版本

error_log logs/error.log error;

#如果此模块被编译为动态模块并且要使用与RTMP相关的功
#能时,必须指定下面的配置项并且它必须位于events配置
#项之前,否则NGINX启动时不会加载此模块或者加载失败

#load_module modules/ngx_http_flv_live_module.so;

events {
    worker_connections  4096;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    server {
        listen       80;

        location / {
            root   /var/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /live {
            flv_live on; #打开HTTP播放FLV直播流功能
            chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复

            add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
            add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
        }

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root /tmp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /dash {
            root /tmp;
            add_header 'Cache-Control' 'no-cache';
        }

        location /stat {
            #push和pull状态的配置

            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /var/www/rtmp; #指定stat.xsl的位置
        }

        #如果需要JSON风格的stat, 不用指定stat.xsl
        #但是需要指定一个新的配置项rtmp_stat_format

        #location /stat {
        #    rtmp_stat all;
        #    rtmp_stat_format json;
        #}

        location /control {
            rtmp_control all; #rtmp控制模块的配置
        }
    }
}

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;

rtmp {
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;

    log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
    log_size     1m; #log模块用来记录日志的缓冲区大小

    server {
        listen 1935;
        server_name www.test.*; #用于虚拟主机名后缀通配

        application myapp {
            live on;
            gop_cache on; #打开GOP缓存,减少首屏等待时间
        }

        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }

    server {
        listen 1935;
        server_name *.test.com; #用于虚拟主机名前缀通配

        application myapp {
            live on;
            gop_cache on; #打开GOP缓存,减少首屏等待时间
        }
    }

    server {
        listen 1935;
        server_name www.test.com; #用于虚拟主机名完全匹配

        application myapp {
            live on;
            gop_cache on; #打开GOP缓存,减少首屏等待时间
        }
    }
}

那么我们的推流地址就是 rtmp://66.42.38.183/myapp/streamname

记得去宝塔的安全里面 开放一下1935端口!切记!不然会推不上。

TIM截图20200213182806.png

然后用ffmpeg测试推流

ffmpeg -re -i atm.mp4 -c copy -f flv rtmp://66.42.38.183/myapp/streamname

TIM截图20200213221137.png

Y__`PCDWP8TR_2_S_L5HJ12.png

你就得到了一个循环播放的迪迦奥特曼2333

总结

牛逼RTMP,垃圾Flash!

补充

由于RTMP是基于AdobeFlash那套的东西,所以播放起来比较恶心。

如果一定要使用swf播放的话,文件在这:http://url.cn/56d1uTj

但是中国人民的智慧是伟大的

<html>  
  <head>  
  <title>视频直播</title>  
  <meta charset="utf-8">  
  <link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet">  
  <!-- If you'd like to support IE8 -->  
  <script src="http://vjs.zencdn.net/ie8/1.1.1/videojs-ie8.min.js"></script>  
</head>  
<body>  
  <h1>直播间</h1>  
 <video id="my-video" class="video-js" controls preload="auto" width="640" height="300"  
 poster="https://pic.gksec.com/2020/02/13/a2942ea2ade0b/timg.jpg" data-setup="{}">  
    <source src="rtmp://66.42.38.183/myapp/streamname" type="rtmp/flv">  
    <!-- 如果上面的rtmp流无法播放,就播放hls流 -->  
    <!-- <source src="http://10.10.5.119/live/livestream.m3u8" type='application/x-mpegURL'> -->  
    <p class="vjs-no-js">播放视频需要启用 JavaScript,推荐使用支持HTML5的浏览器访问。  
      To view this video please enable JavaScript, and consider upgrading to a web browser that  
      <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>  
    </p>  
 </video>  
 <script src="http://vjs.zencdn.net/5.5.3/video.js"></script>  
</body>  
</html> 

相较于Flash来说还是js更香啊。

当然,最好就是不用rtmp来播放,尽量使用http来播放,经过测试这样的速度会快很多,这里用到了bilibili的开源项目flv.js。

<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.js"></script>
<video id="videoElement"></video>
<script>
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: 'http://66.42.38.183/live?port=1935&app=myapp&stream=streamname'
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
</script>