nginx使用nginx-http-flv-module搭建流媒体直播服务 (超详细)

前言

之前使用 nginx-rtmp-module 搭建的直播服务 详见,但rtmp协议需要使用flash,浏览器已经禁用了flash所以是时候该更新技术了。

关于各种直播协议详见这里

nginx-http-flv-module是基于nginx-rtmp-module 的。它具备了所有nginx-rtmp-module的功能,并且新增多种新功能。

功能nginx-http-flv-modulenginx-rtmp-module备注
HTTP-FLV (播放)x支持 HTTPS-FLV 和 chunked 回复
省略 listen 配置配置中必须有一个 listen--
定时打印访问记录x--
纯音频支持wait_video 或 wait_key 开启后无法工作--
JSON 风格的 statx--
stat 中包含录制详情x--

最重要的是nginx-http-flv-module基于 HTTP 协议来传输 FLV 格式的流媒体,这样前端就可以使用flv来播放。

nginx添加 nginx-http-flv-module

下载 nginx-http-flv-module

编译nginx-http-flv-module

由于之前已经安装了一些其他的模块,所以先看看nginx当前拥有哪些module,进入nginx安装目录,..nginx/sbin文件夹下执行./ngin -V

[root]# cd /usr/local/nginx/sbin/
[rootsbin]# ./nginx -V
nginx version: nginx/1.20.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k  26 Jan 2017
TLS SNI support enabled
configure arguments: --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.12 --with-openssl=../openssl-1.0.2k --with-http_ssl_module --with-http_mp4_module 

  • 进行编译时复制上面查到的nginx的module,添加新的module

切换到解压后的nginx目录中执行:(复制上面的命令添加--add-module=../nginx-http-flv-module-master)

./configure --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.12 --with-openssl=../openssl-1.0.2k --with-http_ssl_module --with-http_mp4_module --add-module=../nginx-http-flv-module-master

 参数说明:

    --prefix 用于指定nginx编译后的安装目录

    --add-module 为添加的第三方模块,此次添加了fdfs的nginx模块

    --with..._module 表示启用的nginx模块,
  • 执行make 进行编译

如果编译成功的话会在第一步中objs中出现一个nginx文件 ,这里我遇到一个坑,之前安装了 nginx-rtmp-module现在添加nginx-http-flv-module 编译报错了,去掉nginx-rtmp-module就好了

特别注意:在已安装的nginx上进行添加模块的话执行到这里就行了,把objs中的nginx替换掉之前的安装的nginx/sbin/中的nginx文件,如果执行下一步的install,会导致之前安装的nginx被覆盖,比如之前配置好的nginx.conf文件

  • 替换原有nginx/sbin下的nginx文件,建议先进行备份,记得先停掉nginx不然文件无法操作
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx
  • 执行重启
cd /usr/local/nginx/sbin/
./nginx -s reload

配置nginx.config文件

原有的配置文件中添加 rtmp

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

     server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
        }

       application douyin{
               live on;
               allow publish all;
               allow play all;  # 允许所有用户播放流
               record off;
            hls on;
            hls_path /usr/local/video/hls;
            hls_fragment 10s;  #切片时长
            hls_playlist_length 60m; #播放列表
            hls_continuous on;
            hls_cleanup off;  # 防止自动清除切片
       }

        application video{
            # 点播视频 播放地址为 rtmp://ip:1935/video/1.mp4 
           play /home/admin/video;
        }
    }

}

    #播放流
    server {
        listen       80;
        server_name  localhost;

        location /live {
            flv_live on;
            chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复 
            add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
            add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头      
         }

        location /flv {
           types{
             application/vnd.apple.mpegurl m3u8;
             video/mp2t ts;
           }
        alias /test;
        expires -1;
        }

        # control控制器
        location /control {
            rtmp_control all;
        }
        location /stat {
            #推流播放和录制统计数据的配置
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
         }
         location /stat.xsl {
             root /user/local/nginx/nginx-http-flv-module-master/; #指定 stat.xsl 的位置
         }

主要配置为: rtmp标签下的server配置其监听1935端口,并配置了两个application, douyin设置属性live on 表示开启直播,video配置的是点播,在配置的目录下放视频就可以拉流播放。

http标签下的server配置其监听80端口,并配置location /live设置属性 flv_live on。注意其中的 add_header ‘Access-Control-Allow-Origin’ ‘*’ 与 add_header ‘Access-Control-Allow-Credentials’ ‘true’ 很重要,主要解决了前端通过HTTP方式拉流是的跨域问题

配置完之后重启nginx ,

测试推拉流

浏览器打开 http://ip/stat 可以看到统计页面

微信图片_20240815114024.png

推流测试

推流使用 OBS Studio软件:输入推流地址,

微信截图_20240815112533.png

根据nginx的推流配置的端口和应用名

推流地址示例: rtmp://localhost:1935/douyin/ 流秘钥设置为房间名: test

此时就可以开始推流了。

播放流测试

使用能播放直播流的软件就行potplayer 或者 vlc。 也可以网页播放http://tool.liflag.cn/html5-player/index.html,输入播放流即可。

根据nginx的拉流配置的端口和推流的房间名应用名则可知道 播放流地址为 http://ip/live?port=1935&app=douyin&stream=test


已有 0 条评论

    我有话说: