天天看點

【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

【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器

 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

示例圖:

【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器

 說明1:計劃用自帶攝像頭進行測試,如果是遠端攝像頭,原理差不多

3)打開攝像頭,測試攝像頭是否可用

ffplay -f dshow -i video="EasyCamera"

 說明: 執行後,會打開窗體,顯示攝像内容

示例圖:

【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器
【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器

 推流指令備份-視訊檔案(此指令備份後續用,測試時不用執行)

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即可

推流成功-示例圖:

【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器

四、測試-拉流

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使用示例圖:

【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器
【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器
【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器
【Linux】Ngnix + Flv | RTMP | FLV | HLS | 搭建視訊伺服器

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