1. 程式人生 > 其它 >通過 nginx 搭建一個基於 http-flv 的直播流媒體伺服器

通過 nginx 搭建一個基於 http-flv 的直播流媒體伺服器

obs + nginx + nginx-http-flv-module+ VLC實現直播

實現思路

  • 下載obs軟體,通過RTMP推流(下載軟體不演示了)
  • 通過nginx開啟一個流媒體服務,在obs中推流到該伺服器,通過HTTP-FLV拉流
  • 下載VLC軟體, VLC播放器實現HTTP-FLV拉流進行播放 (下載軟體不演示了)

1 搭建流媒體伺服器

安裝新增RTMP和HTTP-FLV模組的Nginx,並進行配置。 如果已安裝過nginx,可以跳過安裝步驟,直接新增模組,這裡不再贅述。

1.1 安裝Nginx

以mac系統為例: 首先更新brew

brew update

安裝編譯nginx所需的開發包

brew install gcc
brew install pcre pcre-devel
brew install openssl openssl-devel
brew install wget unzip

一、下載原始碼

為了讓 nginx 擁有處理流媒體的能力,我們需要通過 編譯安裝 的方式來安裝 nginx。

由於在本篇中我們嘗試講清楚的是搭建一個基於 http-flv 的流媒體伺服器,所以在編譯時,我們需要為 nginx 新增 nginx-http-flv-module 模組。

我們把 nginx 和 nginx-http-flv-module 的原始碼都下載到 /tmp 目錄下

cd /tmp
git clone nginx-http-flv-module
wget https://nginx.org/download/nginx-1.20.2.tar.gz

解壓剛剛下載的 nginx,並進入到 nginx 的目錄

tar -xzf nginx-1.20.2.tar.gz
cd nginx-1.20.2

二、編譯安裝

./configure --add-module=/tmp/nginx-http-flv-module --with-http_ssl_module
make
make install

 

這麼一個過程下來後,nginx 會被安裝在 /usr/local/nginx

 底下。

需要注意的是,nginx-http-flv-module 是基於 nginx-rtmp-module 開發的,完全相容 nginx-rtmp-module 的所有功能,所以在編譯時無需重複新增 nginx-rtmp-module 模組。

上述命令中還包含了 --with-http_ssl_module 引數,是根據 nginx-rtmp-module 的編譯安裝說明進行的。

1.2 Nginx配置

/usr/local/nginx/conf/nginx.conf中,新增相關的配置。

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }

        location /live { # 拉流時的 uri ,可以自行修改
            flv_live on; # 開啟 http-flv 服務
            chunked_transfer_encoding on;
            add_header 'Access-Control-Allow-Origin' '*'; # 允許跨域
            add_header 'Access-Control-Allow-Credentials' 'true';
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
rtmp_auto_push on;
rtmp {
    server {
        listen 553;  # 接受推流的埠號
        chunk_size 8192; # 單一推流資料包的最大容量?
        application myapp { # myapp 模組,可以自行更換名字
            live on; # 開啟直播
            # 非常重要, 設定讓ngnix斷開阻塞中的連線, 才能觸發exec_record_done
            # 以及客戶端的LFLiveKit reconnectCount自動重新連線才會好用
            drop_idle_publisher 5s;
            meta off; # 為了相容網頁前端的 flv.js,設定為 off 可以避免報錯
            gop_cache on; # 支援GOP快取,以減少首屏時間
            allow play all; # 允許來自任何 ip 的人拉流
        }
    }
}

1.3 啟動Nginx

啟動位於 /usr/local/nginx/sbin 的 nginx

sudo ./nginx
  • rtmp推流地址(舉例,可以用obs推流出來):

rtmp://localhost:553/myapp/mystream

  • http-flv拉流播放地址(舉例):

http://localhost:8080/live?port=553&app=myapp&stream=mystream

 

其中的 myapp 指的是配置檔案(nginx.conf)中 rtmp 塊指定的 application,一個 rtmp server可以擁有多個 application,只要名字對應的上,叫啥都可以。

示例地址中的 mystream 可以由使用者自己指定,只要拉流地址的引數stream對應的上就行了,有點類似於房間的概念,推流要推到哪個application底下的哪個房間的感覺。

1.3 使用 OBS 推流

我這裡使用的是 OBS 軟體進行推流,開啟 OBS 設定面板 > 推流(具體怎麼配置推流也可以百度)

 

 

 

  1. 將服務設定為: 自定義
  2. 伺服器設定為不包含房間名的推流地址示例: rtmp://localhost:553/myapp/
  3. 流祕鑰設定為房間名: mystream

1.4 使用 VLC軟體拉流播放直播

 

 

博文參考:

http://123.57.164.21/?p=1458

https://juejin.cn/post/6978882334829477918