使用nginx-rtmp-module搭建RTMP直播服務器

注:本文環境默認爲linux
首先需要下載
nginx-1.8.1
nginx-rtmp-module

因爲nginx-rtmp-module對nginx的版本限制比較大,所以最好使用上面給出的nginx版本。

安裝nginx
1.首先下載安裝nginx-1.8.1

//也可以電腦上下載完後上傳到服務器
wget http://nginx.org/download/nginx-1.8.1.tar.gz

2.安裝依賴

yum apt-get update
yum apt-get install libpcre3 libpcre3-dev 
yum apt-get install openssl libssl-dev

3.解壓

tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/live

4.配置

//改變默認監聽端口(進入nginx解壓後根目錄),找到下圖位置,修改端口號
vi conf/nginx.conf
i
編輯....
ESC
shift+q
x

這裏寫圖片描述

5.添加nginx-rtmp-module模塊並編譯安裝
將下載的nginx-rtmp-module文件解壓,進入第3步解壓完的nginx-1.8.1文件夾中

./configure --add-module=../nginx-rtmp-module-master --prefix=/usr/local/live/nginx
make
make install

6.運行nginx,進入第5步安裝完後的nginx文件

./sbin/nginx

瀏覽器出現如下界面就表示nginx安裝成功了,url爲 http:// + 服務器 ip + : + 第4步改的端口號
這裏寫圖片描述

搭建流媒體服務器相關配置
1.繼續上面的第4步

events {
    worker_connections  1024;
}
//...................
//添加的部分
rtmp {
    server {
        listen 8001;#之後推流拉流的端口
        chunk_size 4096;

        application live {  #
            live on;
        }
    }
//...................
}
server {
        listen       8000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #...................
        #添加的部分
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            #爲nginx-rtmp-module解壓的地址
            root /usr/local/live/nginx-rtmp-module-master/;
        }
        #...................
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

配置完成後重啓nginx

./sbin/nginx -s reload

瀏覽器url: http:// + 服務器ip +: + 端口號 + /stat
出現下方紅框部分則配置成功
這裏寫圖片描述

這時候就可以試試推流給流媒體服務器了。
我這裏是使用ffmpeg將保存在服務器上的mp4文件推成rtmp流來測試的,大家也可以使用OBS來生成rtmp推流。
講下ffmpeg吧,之後還會使用ffmpeg實現在線轉流服務。

ffmpeg安裝配置
因爲之前寫的博客中有涉及到ffmpeg安裝,所以這裏就直接放上鍊接了
ffmpeg安裝

ffmpeg推流本地MP4文件
因爲我沒有把ffmpeg加入到環境中,所以就直接用路徑運行了,
/usr/local/ffmpeg爲我的服務器ffmpeg安裝路徑。
新建/usr/local/live/video文件夾用來放置測試用的MP4文件。
rtmp://172.16.253.146:8001/live/test 推流路徑 8001 就是上面配置rtmp的監聽端口,live爲application配置號,test可以隨便取名

/usr/local/ffmpeg/bin/ffmpeg -re -i /usr/local/live/video/1.mp4 -vcodec copy -acodec copy -f flv rtmp://172.16.253.146:8001/live/test

執行上面命令後控制檯的大致樣子
這裏寫圖片描述

此時ffmpeg正將MP4文件以rtmp協議推送給上面的nginx流媒體服務器,此時可以進入 http:// + 服務器ip +: + 端口號 + /stat 網頁查看信息
如下圖,先不要看紅框中的,應該會出現藍框中的信息,publishing,就是推流端,可以看到有一個流正在一直被推送給nginx服務器
這裏寫圖片描述

然後可以使用播放器收看該直播流,這裏推薦時用VLC,這個百度下就能下到,所以也不放出下載地址了。
VLC收看直播流
這裏寫圖片描述

填入上面推流的url:rtmp://172.16.253.146:8001/live/test
這裏寫圖片描述

就可以收看剛纔推送的MP4文件直播了
這裏寫圖片描述

然後回到剛纔的頁面,刷新下就可以看到多了一個play流,即有一個播放端在播放該RTMP流,如下圖,先無視掉藍框中的東西(那些是在線轉碼時用到的),紅框中出現了一個play,地址正是我用VLC播放直播流的PC IP地址。
這裏寫圖片描述

實際直播時可以使用PC 上的OBS等軟件錄製直播發送推流給nginx服務器,或者什麼微信小程序等等都可以,之後有空會講下微信小程序錄制直播流和觀看直播流的相關操作。

ffmpeg在線轉流
因爲實際直播中,因爲網絡等因素,在網絡聯通不流暢時就需要看清晰度低一些的直播,所以還需要提供多個不同清晰度的直播流來供觀衆選擇。因此在線轉流也是必須的,這是我們可以看下nginx-rtmp-module作者所給出的功能介紹:
這裏寫圖片描述

ffmpeg在線轉碼。
因爲之前我也有使用ffmpeg的經歷,所以也就直接拿來用了。
對照作者給出的使用方式模板:

 # Transcoding (ffmpeg needed)
        application big {
            live on;

            # On every pusblished stream run this command (ffmpeg)
            # with substitutions: $app/${app}, $name/${name} for application & stream name.
            #
            # This ffmpeg call receives stream from this application &
            # reduces the resolution down to 32x32. The stream is the published to
            # 'small' application (see below) under the same name.
            #
            # ffmpeg can do anything with the stream like video/audio
            # transcoding, resizing, altering container/codec params etc
            #
            # Multiple exec lines can be specified.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};
        }

        application small {
            live on;
            # Video with reduced resolution comes here from ffmpeg
        }

就能很輕鬆的進行配置。
我這裏設置了3個不同的清晰度,720,480,360,當然使用的ffmpeg命令只是示範,爲了更好的效果是需要調整的,配置如下:
修改之前添加的live

application live {
            live on;
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 720x405 -f flv rtmp://172.16.253.146:8001/live720/${name};
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 480x270 -f flv rtmp://172.16.253.146:8001/live480/${name};
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 360x202 -f flv rtmp://172.16.253.146:8001/live360/${name};
        }
        application live720{
            live on;
        }
        application live480{
            live on;
        }
        application live360{
            live on;
        }

重啓nginx服務器,進入頁面
http:// + 服務器ip +: + 端口號 + /stat
可以看到如下,test爲原始流,然後轉碼爲其他3個不同清晰度的rtmp流,可以試試使用VLC播放4個流。
這裏寫圖片描述

我這裏看確實分辨率下降了非常多,截圖可能看不出
這裏寫圖片描述

另外ffmpeg還提供了將rtmp流保存爲MP4文件等等功能,所以我麼也可以根據需要來定製自己的服務。當然nginx-rtmp-module自身也可以進行相應配置將流保存到本地等等功能,這些可以去作者的博客&github自己查看文檔。
nginx-rtmp-module有一個缺點是不支持集羣,關於這裏應該如何進行架構設計可以參考 如何從零開始搭建高性能直播平臺 這裏不再深入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章