【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建视频服务器

一、场景说明

        1、通过Nginx + Flv模块搭建视频服务器

        2、通过ffmpeg拉去摄像头视频,推送到视频服务器

        3、通过flv.js拉取视频流(http方式播放视频)

二、操作步骤

1、安装Nginx,参考:安装Nginx-方案二

2、下载Nginx-Flv模块

1)码云地址

2)云盘地址,密码:6326

3、Nginx-Flv模块上传服务器

1)进入到Nginx安装目录

cd /usr/local/nginx/

2)上传nginx-http-flv-module-master.zip并解压,并重命名为nginx-http-flv-module

 3)zip解压

unzip nginx-http-flv-module-master.zip

4)重命名

mv nginx-http-flv-module-master nginx-http-flv-module

4、进入到Nginx安装包目录,重新编译

1)进入Nginx安装目录

cd /opt/nginx/nginx-1.18.0

2)重新编译,编译增加Nginx-Flv模块

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-stream --add-module=/usr/local/nginx/nginx-http-flv-module

3)重新编译,执行编译并安装

make && make install

 5、配置Nginx

1)进入Nginx安装目录

cd /usr/local/nginx/conf/

2)编辑nginx.conf

vim nginx.conf

3)增加内容-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_size 1m;
        server{
		listen 1935;
		application myapp{
			live on;
			gop_cache on;
			record off;
		}
		application hls{
			live on;
			hls on;
			hls_path /usr/local/nginx/html/hls;
		}
		application dash{
			live on;
			dash on;
			dash_path /usr/local/nginx/html/dash;
		}
        }
}

说明1: 与http同级别

说明2:端口1935,若冲突,自行修改

说明3:application myapp,myapp即应用名,即推流地址为: rtmp://${ip}:1935/myapp/${stream_name}

说明4: ${stream_name},即数据流名,可理解为数据流ID

4)增加内容-http

内容:

server {
        listen       19351;

        location /live{
                flv_live on;
                chunked_transfer_encoding  on;
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
        }
        location /hls{
                types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
                 }
                 root html;
                 add_header 'Cache-Control' 'no-cache';
        }
         location /dash {
            root /usr/local/nginx/html/dash;
            add_header 'Cache-Control' 'no-cache';
        }

        location /stat {
              rtmp_stat all;
              rtmp_stat_stylesheet stat.xsl;
         }
        location /stat.xsl {
          root /usr/local/nginx/nginx-http-flv-module;
        }

         location /control {
            rtmp_control all; #configuration of control module of rtmp
        }

    }

说明1:放到http内,与server同级

说明2:端口19351

说明3- 拉流地址为:

http://${ip}:19351/live?port=1935&app=${appName}&stream=${streamName}

# ${appName},即应用名,eg:myapp
# ${streamName},即数据流名,eg: live_stream
# eg: http://${ip}:19351/live?port=1935&app=myapp&stream=live_stream

5)完整nginx.conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
user root;

events {
    worker_connections  1024;
}

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_size 1m;
        server{
         listen 1935;
         application myapp{
                 live on;
                 gop_cache on;
		record off;
          }
         application hls{
          live on;
          hls on;
          hls_path /usr/local/nginx/html/hls;
        }
         application dash{
           live on;
           dash on;
           dash_path /usr/local/nginx/html/dash;
        }
	}
}

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

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       19351;

	location /live{
                flv_live on;
                chunked_transfer_encoding  on;
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
        }
        location /hls{
                types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
                 }
                 root html;
                 add_header 'Cache-Control' 'no-cache';
        }
         location /dash {
            root /usr/local/nginx/html/dash;
            add_header 'Cache-Control' 'no-cache';
        }

        location /stat {
              rtmp_stat all;
              rtmp_stat_stylesheet stat.xsl;
         }
        location /stat.xsl {
          root /usr/local/nginx/nginx-http-flv-module;
        }

         location /control {
            rtmp_control all; #configuration of control module of rtmp
        }
    
    }
    server {
        listen       8081;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 6、重启Nginx

1)停止Nginx

systemctl stop nginx

2)启动Nginx

systemctl start nginx

 三、测试-推流

1、下载ffmpeg,Windows版

1)直接下载

2)直接下载若失效,请到官网下载

3)云盘备用,密码:6326

 2、设置环境变量

1)若设置,Path添加:${前缀}\ffmpeg-2021-07-25-git-a2a7547b2f-full_build\bin

2)若不设置,ffmpeg指令将cmd切换到ffmpeg的bin目录

3、检测ffmpeg

1)打开cmd

2)查看设备

ffmpeg -list_devices true -f dshow -i dummy

示例图:

 说明1:计划用自带摄像头进行测试,如果是远程摄像头,原理差不多

3)打开摄像头,测试摄像头是否可用

ffplay -f dshow -i video="EasyCamera"

 说明: 执行后,会打开窗体,显示摄像内容

示例图:

 推流指令备份-视频文件(此指令备份后续用,测试时不用执行)

ffmpeg -re -i demo.wmv -f flv rtmp://127.0.0.1:1935/live/123

 4)推流-摄像头

ffmpeg  -y -rtbufsize 100M -f dshow -i video="EasyCamera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://ip:1935/myapp/live

说明1: 更换摄像头名称,我的名称是“EasyCamera”,你的不一定

说明2: 修改rtmp的服务器地址,修改你的IP即可

说明3: 如果报错的话,还请自行度娘

说明4: 执行此命令前,先关闭“3)打开摄像头,测试摄像头是否可用”的摄像窗体,不然摄像头被占用,推流失败

说明5: 如果遇到 “I/O error”,检查推流地址是否正确;正确示例:

rtmp://ip:1935/myapp/live

# myapp, 应用名;nginx.conf中,rtmp中需配置application myapp
# live,数据流名,无需配置;推流时,用live,拉流时,也用live即可

推流成功-示例图:

四、测试-拉流

1、下载flv.min.js,密码:6326

2、下载flv-index.html,密码: 6326

3、修改flv-index.html

1)编辑flv-index.html

2)修改flv地址,62行

3)url修改为:

http://ip:19351/live?port=1935&app=myapp&stream=live

app,即应用名

stream,即数据流名,与推流时保持一致

说明1: ip跟端口,记得换成自己服务器的IP跟端口

4、运行flv-index.html

五、其他说明

1、拉流测试,也可以通过三方软件,进行二次确认,比如: VLC

1)VLC,官网下载

2)VLC,云盘下载,密码:6326

3)VLC使用示例图:

 

2、暂时OK,有问题,还请思考后再度娘

 六、补充HLS,推流与拉流

1、推流

1)Nginx配置文件,已经配置了HLS

2)修改ffmpeg推流地址即可,推流指令:

ffmpeg  -y -rtbufsize 100M -f dshow -i video="EasyCamera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://ip:1935/hls/live

说明1: 记得修改摄像头名称与IP地址

说明2:相比flv,把myapp -> hls

 2、拉流

1)下载hls-index.html,密码:6326

2)修改source地址即可

3)拉流地址

http://ip:19351/hls/live.m3u8

# 推流后,会创建m3u8文件
# 对应,服务器文件: /usr/local/nginx/html/hls/live.m3u8

文件示例图:

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值