nginx搭建流媒体服务器,实现点播,直播,转播,录播(直播回放)功能(未完)

nginx-http-flv-module的功能

    兼容nginx-rtmp-module所有功能
    支持HTTP-FLV/HTTPS-FLV方式的直播
    支持GOP缓存,以减少首屏时间
    支持虚拟主机功能
    可以省略listen配置项而不影响基本功能
    修复nginx-rtmp-module已知的bug

第一:以动态模块的方式编译安装nginx(基于centos9stream)

#安装必要组件
    yum install gcc pcre-devel openssl-devel zlib zlib-devel zip -y
    如果NGINX要支持正则表达式,需要PCRE库。
    如果NGINX要支持加密访问,需要OpenSSL库。
    如果NGINX要支持压缩,需要zlib库。

#下载,解压,重命名nginx和nginx-http-flv-module模块)(这是项目地址:https://github.com/winshining/nginx-http-flv-module)
    cd /root ; wget http://nginx.org/download/nginx-1.25.2.tar.gz
    tar xf nginx-1.25.2.tar.gz ; mv nginx-1.25.2 nginx

    #注意当前版本有一个bug,就是当你在推流时,服务端reload nginx 后进程会"worker process is shutting down"
    git clone https://github.com/winshining/nginx-http-flv-module.git

#加载nginx-http-flv-module 模块编译安装nginx
mkdir /app/nginx -p
cd /root/nginx

#nginx-http-flv-module包含了nginx-rtmp-module所有的功能,所以不要将nginx-http-flv-module和nginx-rtmp-module一起编译。
./configure --prefix=/app/nginx --add-dynamic-module=/root/nginx-http-flv-module
#./configure --prefix=/app/nginx --add-dynamic-module=/root/nginx-http-flv-module --with-http-per-worker-listener --with-debug
#--with-http-per-worker-listener 需要先为nginx打上补丁,抱歉能力有限,没打上

make
make install
#删除多余默认的nginx配置文件
    rm -f /app/nginx/conf/nginx.conf.default

#把自带的xml格式的统计文件,移动到nginx目录下
    cp /root/nginx-http-flv-module/stat.xsl /app/nginx/html/

配置nginx的全局模块,后期需要用到的模块功能。全部以配置文件的形式在全局模块中进行引用

    cat /app/nginx/conf/nginx.conf

user  nginx;
worker_processes  1;
#在events前面添加http-flv动态模块
load_module /app/nginx/modules/ngx_http_flv_live_module.so;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /app/nginx/conf/stat.conf;
    include /app/nginx/conf/LL-http.conf;
}
include /app/nginx/conf/TL-rtmp.conf;       #注意这配置的是rtmp直播推流,他不在http模块里面,而是放在http模块外面

配置nginx的相关统计界面展示

    cat /app/nginx/conf/stat.conf

server {
    listen      8081;
    location /stat {
        #push和pull状态的配置
        #rtmp_stat_format json; #默认是格式,这里可以指定为json格式。
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /app/nginx/html; #指定stat.xsl的位置
    }
    #如果需要JSON风格的stat, 不用指定stat.xsl
    #但是需要指定一个新的配置项rtmp_stat_format
    location /control {
        rtmp_control all; #rtmp控制模块的配置
    }
}
#这是访问地址:http://192.168.60.7:8081/stat
#下面展示的是浏览器访问的效果页面

推流配置:

配置rtmp直播推流模块,并配置录播功能,将流保存为flv的视频文件存在本地(其实也rtmp的拉流也就一起完成了配置)

#创建录播文件存储位置,并将目录的所属组改成nginx(这个很重要,不然数据无法写入)
    mkdir -p /video/on-live/flv ; useradd nginx ; chown nginx /video/on-live -R

#下面是rtmp推流设置
    cat /app/nginx/conf/TL-rtmp.conf

rtmp_auto_push on;      #因为Nginx可能开启多个子进程,这个选项表示推流时,媒体流会发布到多个子进程
rtmp_auto_push_reconnect 1s;
#rtmp_socket_dir /video;      #多个子进程情况下,推流时,最开始只有一个子进程在竞争中接收到数据,然后它再relay给其他子进程,他们之间通过 socket传输数据,这个选项表示unix domain socket的路径
rtmp {
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;
    log_interval 30s;           #log模块在access.log中记录日志的间隔时间,对调试非常有用
    log_size     1m;            #log模块用来记录日志的缓冲区大小
    server {
        listen 1935;
        chunk_size 4096;    #流多路复用的最大块大小。默认值为4096。此值越大,CPU开销越低。该值不能小于128。
        application on-live {
                live on;        #开启直播直播模式,一对多广播
                hls on;
                gop_cache on;   #开启解决首屏响应问题,加快响应
                wait_key on;    #对视频切片进行保护,开启后发现分片保存的数量多了,功能是使视频流重一个关键帧开始,默认为off
                hls_path /video/on-live/hls;    #hls切片视频文件存放位置,若是配置hls拉流的形式,拉流配置里面要写清楚这个路径
                hls_fragment 5s;        #默认是5秒。只能为整数,#每个视频切片的时长
                hls_playlist_length 60s;    ##总共可以回看的事件,这里设置的是1分钟
                hls_continuous on;      #连续模式
                hls_cleanup on;         #对多余的切片进行删除
                #publish_notify on; #推流验证,和下一行需一起使用
                #on_publish http://localhost/auth.php; #推流验证,具体可参照后文

                #下面是录播配置
                record all;         #启用录制所有信息,包括视频和声音(有其他可选项,参考文档)
                record_path /video/on-live/flv; #flv录制文件存放地址。注意该目录的所有者要是nginx,或者777权限
                record_max_size 300M;   #控制文件的大小,每个文件到了300m后,结合下面的参数新创建一个文件继续保存
                record_unique on;       #在文件名后加上unlix时间戳,防止重复写同一文件造成视频丢失(默认是关闭的)
        }
    }
}

#当我们这样配置后,我们的推流地址将会是:rtmp://192.168.60.7/on-live/
#当我们确定要推流时,流名字设置为(王者荣耀)wzry时,我们的推流地址是:rtmp://192.168.60.7/on-live/wzry
#同时,我们的rtmp播放地址将是:rtmp://192.168.60.7/on-live/wzry

拉流配置:配置http-flv方式 以及 hls方式 播放直播流

    cat /app/nginx/conf/LL-http.conf

#http-flv方式
server {
    listen      80;
    location /live {
        flv_live on;        #打开HTTP播放FLV直播流功能
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
 }
#hls方式
server {
    listen  8080;
    location /hls {
        # Serve HLS fragments
        types {
            application/vnd.apple.mpegurl m3u8;
            #或者这样写 application/x-mpegURL
            video/mp2t ts;
        }
        alias /video/on-live/hls/;      #直播hls分片的路径,一定要写哦,很重要
        chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
}

==============分割线=============
#http-flv的播放方式及地址:(vlc)
 #拉流url为    http://ip:port/[http拉流app名字]?port=[rtmp推流端口]&app=[rtmp推流app名字]&stream=[视频流名称]
        http://192.168.60.7/live?port=1935&app=on-live&stream=wzry
        如果要实现 HTML5 对http-flv的形式播放,可以使用 B 站开源的 flv.js,更多内容可以参照其文档,此处不做更多说明。

#hls的播放方式及地址
    第一:先在nginx中的web目录创建播放页面文件,并且把hls的路径写进去(注意内容里src的写法)
    cat /app/nginx/html/index.html

<!--index.html-->
<html>
<body>
    <video autoplay webkit-playsinline controls>
        <source src="http://192.168.60.7:8080/hls/wzry.m3u8" type="application/vnd.apple.mpegurl" />
        <p class="warning">Your browser does not support HTML5 video.</p>
    </video>
</body>
</html>

    第二:如何播放,直接用浏览器打开网址就可以   http://192.168.60.7/index.html

    下面附图是主流浏览器对HLS的支持情况(移动端安卓和IOS的浏览器基本都支持的,window PC端支持力度不够,)
    如果浏览器并不原生支持 hls,可使用第三方插件,例如 hls.js;或者使用 video.js 配合 videojs-contrib-hls,这也是不错的解决方案

配置点播:http & rtmp点播的配置与播放方式

#先确定视频文件的路径(把视频文件放到/video/vod/ 这个目录下即可)
[root@rtmp-http-mp4-flv video]# ls /video/vod/ -l
total 17052
-rw-r--r-- 1 root root 17458996 Mar 26  2019 1.mp4

#配置http的点播,直接在浏览器里面输入url路径即可播放(注意:这是在http模块中配置的)
server {
    listen     8080;
    location /dianbo {
        alias /video/vod;
        limit_rate_after 50m;               #---------下载10m后再限速
        limit_rate 5000k;                    #----------限速500k
    }
}

#配置rtmp的点播,rtmp方式的点播很不友好建议不开,不能快进,快进就卡死(注意:这是在rtmp模块下配置的)
#server {
#    listen 1935;
#    chunk_size 4096;
#    application dianbo {
#            play /video/vod;
#    }
#}

#http方式的点播放方式及地址(浏览器直接打开)
    "http://192.168.60.7:8080/dianbo/1.mp4"

#rtmp方式的点播播放方式及地址(用vlc吧)
#  "rtmp://192.168.60.7/dianbo/1.mp4"

配置:流中继,转播(由于rtmp的实时性,低延迟,这里只做了rtmp的转播配置)

注意:至少要有一个客户端连接,才会去拉取源流,我测试中,本地不会保存任何数据

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application bkb-onlive {
                live on;
                gop_cache on;   #开启解决首屏响应问题,加快响应
                hls on;
                pull rtmp://media3.scctv.net/live/scctv_800;    #这是配置rtmp直播转播
                #play /var/local_mirror http://myserver.com/vod;        #点播转播
                hls_path /video/bkb-onlive/hls;
                #下面还可以开启边转播边录制
                #record all;
                #record_path /video/bkb-onlive/flv;
                #record_max_size 100M;
                #record_unique on;
        }
    }
}

#rtmp方式播放地址(注意最后面的流名字)
    rtmp://192.168.60.7/bkb-onlive/scctv_800

#http-flv方式播放地址:(http-flv的拉流配置沿用:第四步:配置http-flv方式 以及 hls方式 播放直播流)
    http://192.168.60.7/live?port=1935&app=bkb-onlive&stream=scctv_800

配置收流服务器:中转推流服务器,将client的直播流 推到 中转服务器,中转服务器再推送到各大网站上,并开启直播验证(类似输入房间号),待完善

#收流与转推配置
rtmp {                          #RTMP服务
    server{
        listen 1935;            #服务端口
        chunk_size 10240;       #数据传输块的大小
        application live {
            live on;
            record off;
            on_publish http://YOUR_SERVERNAME:2080/auth;
            push rtmp://live.twitch.tv/app/YOUR_LIVE_API;   #RTMP直播地址1
            push rtmp://a.rtmp.youtube.com/YOUR_LIVE_API;   #RTMP直播地址2
        }
    }
}

#收流验证配置(类似房间号+密码)
http {
    server {
        listen 127.0.0.1:2080;
        location /auth {
            rewrite_by_lua '
                ngx.req.read_body()
                local name = ngx.req.get_post_args().name
                if (name == "xxxxxxxxxx") then
                    ngx.status = 200
                    ngx.say("OK")
                    ngx.exit(200)
                else
                    ngx.status = 403
                    ngx.say("Forbidden")
                    ngx.exit(403)
                end
            ';
        }
    }
}

#测试 RTMP 服务器配置
    curl -0 http://127.0.0.1:2080/auth -d "name=xxxYOUR_UUID"
    #xxxYOUR_UUID 替换成前面生成的 UUID,应该输出 OK,再把 xxxYOUR_UUID 换成一个错误的,应该输出 Forbidden。

增加rtmp推送校验
正常的直播系统都是需要使用rtmp传送房间号和校验码,所以看上个代码里有一个on_pulish配置。我们需要做个代理进行key校验。
把这个key校验放到8080端口 进行判断。正常情况应该是把这个on_publish请求转发到 python、java、nodejs等后台服务读取数据库进行校验。
这里由于是搭建个人使用环境,就进行简单配置就行了。
http {
    server {
        listen 8080;
        ...
        location /on_publish {
            default_type text/html;
            if ($arg_key != 123456) {
                return 404;
            }
            return 200;
        }
        ...
    }
}

第二:为web播放MP4创建播放器

    rm /app/nginx/html/index.html -rf
    cd /app/nginx/html/
    wget https://qiniu.wsfnk.com/index-play.html
    mv index-play.html index.html

第四:各种客户端,推流,拉流地址(注意这样的直播推流,差不多存在两分钟的延迟)

    http://13.16.37.9/hls/home.m3u8
    rtmp://13.16.37.9/dianbo/1.mp4      #vlc客户端拉流地址
    http://13.16.37.9:8081/2.mp4        #网页播放/vlc都可以,用http协议可以快进
    #下图是推流地址

延迟对比

rtmp:在没开启gop_cache on; 首屏满的要死,开启后首屏秒开,整体延迟在5s左右

附nginx配置文件讲解及 公共的RTMP源

#公共源
1,RTMP协议直播源
美  国  台:rtmp://media3.scctv.net/live/scctv_800
淮北影视频道:rtmp://vod.0561rtv.com:1935/live/live4

2,RTSP协议直播源

3,HTTP协议直播源
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
苹果提供的测试源:http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8

ffmpeg的安装

sudo apt-add-repository ppa:jon-severinsson/ffmpeg
sudo apt-get update
sudo apt-get install ffmpeg

附参考文章
基于 Nginx 搭建视频直播服务器
关于HLS直播流HTML页面播放解决
PC浏览器播放HLS协议的视频

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/122.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/9/22作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录