Linux下使用Nginx結合ffmpeg搭建流媒體服務器

寫在前面

此文章用於記錄本人在搭建流媒體服務器時的遇到的問題。開頭可能會有大量廢話,不想看廢話的看官請直接移步到動手操作一節。

系統環境

此文章內涉及的所有操作均在虛擬機上經過驗證,虛擬機系統爲CentOS 7.

實現功能

既然文章的標題說道是流媒體服務器,那麼這個流媒體服務器能幹嘛?首先,我承認這個所謂的流媒體服務器功能並不全,但它確實是推送的流媒體數據,所以各位看官還不能說我是標題黨。此方案能實現的功能如下:

  • 在瀏覽器中播放RTMP直播源
  • 用RTMP協議點播服務器視頻(不可拖動播放)

衆所周知,不可拖動播放的點播根本毫無意義,這裏只是順便記錄一下而已。

刨根問底

推/拉流

推流和拉流是相對的,對於同一條數據流,如果關注的對象不同,說法也不同。比如現在你用手機在B站上看LOL直播,你的手機和B站服務器之間的數據流,對於你的手機而言是拉流,對於B站的服務器而言則是推流。下文中所有的數據流均以流媒體服務器爲關注對象。

H5如何播放RTMP直播源

首先這裏要明確一點,HTML5中的Video標籤不能直接播放rtmp數據源。這裏就需要用到B站開源的一個叫flv.js的前端庫,是的,你沒有看錯,確實是B站開源的,這裏的B站確實你認識的那個小破站。看樣子B站的98億應該是還沒花完,小破站牛批!

它的工作原理是將 FLV 文件流轉碼複用成 ISO BMFF(MP4 碎片)片段,然後通過 Media Source Extensions 將 MP4 片段喂進瀏覽器。

flv.js的使用和介紹
所以作爲流媒體服務器這裏需要將rtmp視頻流轉成flv視頻流再推出去。時序圖如下:
直播時序圖

服務器需要準備什麼

由上文可以看出,服務器需要做兩件事情:
1.利用rtmp協議進行推/拉流
這裏採用Nginx和它的一個插件nginx-rtmp-module來實現,由於要使用插件所以必須要用編譯的方式重新安裝Nginx。如果你的服務器已經裝了Nginx,由於插件不能動態增減,所以你很有可能要刪掉重裝。相信重裝Nginx和編譯安裝Nginx應該會勸退一大波人,這裏我只能說,編譯安裝真的沒有你想象中那麼難;重裝Nginx的話就祝你好運了,因爲我的虛擬機剛好沒裝過Nginx,所以給不了建議。當然,你也可以把新的Nginx裝在其他目錄並存,只要不同時運行應該就沒問題。

2.將rtmp數據流轉成flv數據流
涉及到視頻轉碼,第一反應就是要用到ffmpeg。但是,CentOS裏面還不能直接用yum安裝ffmpeg,需要添加一個第三方的安裝源才能搜到ffmpeg。真心折騰。
如果你不想做直播服務器,只想做個點播服務器播一下本地視頻,而且不涉及到視頻轉碼操作的話,完全可以不用安裝ffmpeg

動手操作

安裝Nginx

因爲這裏需要用編譯的方法安裝並帶上rtmp模組,所以步驟應該是這樣的:安裝Git,下載rtmp模組,安裝openssl,下載Nginx,安裝。
1.安裝Git

yum -y install git

2.因爲後面要下載挺多東西的,所以建議新建一個文件夾裝下載的東西

mkdir /home/centos/download
cd /home/centos/download

3.進入新建的文件夾後下載rtmp模組

git clone https://github.com/arut/nginx-rtmp-module.git

4.安裝openssl

yum -y install openssl openssl-devel

現在主流都是用https了,openssl這個不能少
5.安裝gcc

yum -y install gcc gcc-c++ autoconf automake make

編譯安裝,沒有編譯器怎麼行?
6.下載Nginx

wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -xzvf nginx-1.16.1.tar.gz

這裏建議先去Nginx的官網看看有沒有最新的穩定版,如果有,就下載最新的穩定版,一般情況下直接改上邊的版本號就可以了。
7.安裝Nginx

cd nginx-1.16.1
./configure --prefix=/home/centos/nginx --add-module=/home/centos/download/nginx-rtmp-module --with-http_ssl_module
make
make install

非常標準的三步走:下載-配置-安裝。
參數解釋:–prefix={安裝路徑} --add-module={之前下載的rtmp模組位置} --with-http_ssl_module
這裏強烈建議要指定prefix安裝路徑,如果不指定,它將分散地會安裝在多個文件夾,什麼/bin /etc什麼的,到時候要換個版本就要一個一個刪。如果指定了安裝路徑,直接刪掉安裝路徑的文件夾就完事了。
8.驗證

cd /home/centos/nginx/sbin
./nginx -V

進入安裝路徑的sbin文件夾,nginx的程序就在這下面。
Nginx版本信息

安裝ffmpeg

因爲默認的yum裏面沒有ffmpeg,所以要先安裝一個第三方的程序源。
1.先安裝epel-release

yum install -y epel-release

2.安裝Nux-Dextop源

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm

3.安裝

yum install -y ffmpeg

安裝完Nux-Dextop源之後就可以搜索到ffmpeg了
4.驗證

ffmpeg -version

看到有一堆版本信息彈出來就說明安裝成功了。

正式使用

這裏說明一下,以下所有的使用均是用Nginx+ffmpeg完成的,不需要用到其他Web網站之類的東西。
幾乎所有功能都只需要修改Nginx的配置文件就能實現。Nginx的配置文件也是一門學問,建議大家有不懂就查看Nginx的說明文檔,裏面都有很詳細的講解。
Nginx配置介紹

直播模式

rtmp.conf

events {
    worker_connections  1024;
}
rtmp{
  server{
    listen 1935;
    chunk_size 4096;
    application live{
      live on;
      record off;
      exec_pull ffmpeg -re -i {直播數據源} -vcodec copy -acodec copy -f flv rtmp://localhost:1935/live/$name;
    }
  }
}

這裏簡單說明一下:

  • listen 1935 監聽的端口,rtmp一般用的是1935
  • chunk_size 4096 流多路複用的最大塊大小。 默認值爲4096。此值越大,CPU開銷越低。 該值不能小於128。
  • application live 指定一個應用配置塊,用於名爲live的應用,名字可以隨便起
  • live on 打開/關閉直播模式
  • record off 是否對直播流進行記錄
  • exec_pull 這裏就是關鍵了,這裏參數後面接的是一條執行命令,這個命令會在第一個請求直播的人開始執行,直到最後一個看直播的人退出才結束。

name參數指的是請求的流名稱,例如: rtmp://{ip}:1935/live/jojo 這個請求就是請求live應用的jojo直播流$name的值就是jojo

這個配置的意思是建立一個名爲live的rtmp應用,它在收到某個直播流請求後會用ffmpeg把這個直播流的數據拉過來並轉成flv數據流再推出去。
如果我們在服務器的/home/centos/videos文件夾下放置多個mp4視頻,然後把exec_pull參數的命令指定爲

exec_pull ffmpeg -re -i /home/centos/videos/$name.mp4 -vcodec copy -acodec copy -f flv rtmp://localhost:1935/live/$name;

這樣就可以實現一個僞電影直播應用。
如果是做監控攝像頭等的直播,我們就需要在exec_pull參數的命令裏指定攝像頭的拉流路徑。

點播模式

rtmp.conf

events {
    worker_connections  1024;
}
rtmp{
  server{
    listen 1935;
    chunk_size 4096;
    application video{
      play /home/centos/videos;
    }
  }
}

play 後面接的時點播文件的文件夾
這裏有兩個需要注意的地方:
1.請求的路徑:rtmp://{ip}:1935/video//{文件名}
這裏要有兩個斜槓,Nginx是由第二個斜槓纔開始讀路徑。
2.播放的文件和所在的文件夾要有讀,寫,執行權限
在這裏插入圖片描述

啓動Nginx

cd /home/centos/nginx/sbin
./nginx -c {配置文件路徑}

其他指令

// 關閉Nginx
./nginx -s quit

// 重啓Nginx
./nginx -s reload

推流效果

對於同一個直播路徑,左邊是用ffplay播放的rtmp流,右邊是用VLC播放的rtmp流。至於瀏覽器用flv.js播放的效果,這裏因爲本人前端技術不佳,所以沒有嘗試,歡迎各位看官補充。
在這裏插入圖片描述

參考資源

開源代碼flv.js的使用說明
Nginx中rtmp模組配置說明
利用Nginx和rtmp模組搭建rtmp流媒體播放服務器
nginx + rtmp 搭建流媒體服務器

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