手把手教你搭建Nginx-rtmp流媒體服務器+使用ffmpeg推流

by -- paperfish

最近嘗試著搭建了搭建一個基于RTMP協議 的流媒體服務器,我采用了Nginx流媒體服務器,并使用 ffmpeg 進行推流,成功推流本地視頻到流媒體服務器上,可以正常播放。

接下來開始進入手把手教程(我的系統是Ubuntu14.04)。

1.安裝ffmpeg

首先安裝h264 視頻編解碼庫:


sudo apt-get update

sudo apt-get install libx264-dev

安裝ffmpeg ,依次輸入以下命令:


wget http://ffmpeg.org/releases/ffmpeg-3.0.9.tar.bz2

sudo tar jxvf ffmpeg-3.0.9.tar.bz2

cd ffmpeg-3.0.9/

sudo ./configure --enable-shared --enable-pthreads --enable-gpl  --enable-avresample --enable-libx264 --enable-libtheora  --disable-yasm

sudo make   

sudo make install

其中sudo make 這個過程會比較久。

安裝完ffmpeg之后,在命令行中輸入ffmpeg 就可以看到類似下面的輸出信息:


lee@ubuntu:~$ ffmpeg

ffmpeg version 3.0.9 Copyright (c) 2000-2017 the FFmpeg developers

built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)

configuration: --enable-pthreads --enable-gpl --enable-avresample --enable-libx264 --enable-libtheora --disable-yasm

libavutil      55. 17.103 / 55. 17.103

libavcodec    57. 24.102 / 57. 24.102

libavformat    57. 25.100 / 57. 25.100

libavdevice    57.  0.101 / 57.  0.101

libavfilter    6. 31.100 /  6. 31.100

libavresample  3.  0.  0 /  3.  0.  0

libswscale      4.  0.100 /  4.  0.100

libswresample  2.  0.101 /  2.  0.101

libpostproc    54.  0.100 / 54.  0.100

Hyper fast Audio and Video encoder

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

如果出現這樣的信息,說明ffmpeg已經安裝成功了。

2.安裝Nginx依賴

我是在根目錄下安裝的依賴。首先在根目錄下創建一個叫做nginx-dependence的文件夾


cd ../../

sudo mkdir nginx-dependence

然后在nginx-dependence中安裝依賴,按行依次運行以下命令。這些依賴一定不要使用apt-get 安裝 ,因為后面在配置Nginx的時候,要提供這些依賴的源碼路徑。(我一開始是使用apt-get 安裝 依賴的,結果在nginx 的configure 步驟出現問題,所以我就重新安裝了)


cd nginx-dependence

sudo wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz

sudo tar -zxvf pcre-8.40.tar.gz

cd pcre-8.40/

sudo ./configure

sudo make

sudo make install

sudo wget http://zlib.net/zlib-1.2.11.tar.gz

sudo tar -zxvf zlib-1.2.11.tar.gz

cd zlib-1.2.11/

sudo ./configure

sudo make

sudo make install

sudo wget https://www.openssl.org/source/old/1.1.0/openssl-1.1.0.tar.gz

sudo tar -zxvf openssl-1.1.0.tar.gz

cd openssl-1.1.0/

sudo ./config

sudo make

sudo make install

在nginx-dependence目錄中,先下載nginx-rtmp-module


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

3.安裝Nginx

首先運行:


apt-get install build-essential

apt-get install libtool

然后下載并安裝Nginx,我安裝的版本是1.12.0,我也是安裝在根目錄的。

依次運行下面的指令。


cd ../../

sudo wget http://nginx.org/download/nginx-1.12.0.tar.gz

sudo tar -zxvf nginx-1.12.0.tar.gz

cd nginx-1.12.0/

sudo ./configure --prefix=/usr/local/nginx --with-pcre=../nginx-dependence/pcre-8.40 --with-zlib=../nginx-dependence/zlib-1.2.11 --with-openssl=../nginx-dependence/openssl-1.1.0  --with-http_ssl_module --add-module=/nginx-dependence/nginx-rtmp-module

sudo make

sudo make install

--with-pcre=../nginx-dependence/pcre-8.40 就是我的pcre依賴所放置的位置,這個位置可根據自己的安裝位置進行靈活配置。--add-module=/nginx-dependence/nginx-rtmp-module 這個module 的路徑也要正確設置為之前下載nginx-rtmp-module的路徑。

如果上面的步驟都沒有出錯,則可以檢驗一下nginx是否已經安裝正確了:

在命令行中輸入這個命令啟動nginx服務器:


sudo /usr/local/nginx/sbin/nginx

如果沒有報任何錯誤,則可以打開瀏覽器看看nginx是否啟動成功。

打開瀏覽器,輸入localhost 或本機的IP地址,按回車,如果看到這樣的界面,說明nginx已經安裝成功并且啟動成功了。

1.png

如果有的時候啟動時出現這樣的提示:

2.png

這是重復啟動導致的。運行sudo /usr/local/nginx/sbin/nginx -s stop 可以先停止運行之前啟動的,然后再次運行

sudo /usr/local/nginx/sbin/nginx 就沒有問題了。

4.配置Nginx流媒體服務器

nginx服務器有一個配置文件叫做nginx.conf ,這個文件默認是位于/usr/local/nginx/conf 目錄下。

我將這個文件改成這樣:


worker_processes  1;

error_log  logs/error.log debug;

events {

worker_connections  1024;

}

rtmp {

server {

listen 1935;

application videotest{

live on;

}

}

}

http {

include      mime.types;

default_type  application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {

listen      80;

server_name  localhost;

location / {

root  html;

index  index.html index.htm;

}

# redirect server error pages to the static page /50x.html

error_page  500 502 503 504  /50x.html;

location = /50x.html {

root  html;

}

}

}

其中rtmp就是rtmp服務器模塊,端口是1935,application我理解為一個路徑。可以通過訪問rtmp://localhost/videotest 來訪問videotest這個資源。live on 表示這是實時的傳輸,這不同于點播,點播就好比我在某視頻網站上想看一個視頻,無論我什么時候去點擊,它會從頭開始播放。而實時傳輸(直播),就是好比看電視,我在19:20去打開電視(打開直播路),視頻不會從頭開始播放,而是從當前(19:20)的視頻數據開始播放。

除了配置rtmp服務器,還可以配置HTTP和HTTPS服務器。這方面我還沒有深入去了解。更多關于nginx服務器和其配置方式,請閱讀nginx官網

5.使用 ffmpeg 推流本地視頻

把配置文件改成第4步中的形式,然后啟動nginx。


sudo /usr/local/nginx/sbin/nginx

我在/home/lee目錄下放置了一個視頻 video.mp4,

3.png

然后在命令行中使用 ffmpeg 進行推流:


ffmpeg -re -i /home/lee/video.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://localhost/videotest

這里有好幾個參數,

-re : 表示使用文件的原始幀率進行讀取,因為ffmpeg讀取視頻幀的速度很快,如果不使用這個參數,ffmpeg可以在很短時間就把video.mp4中的視頻幀全部讀取完并進行推流,這樣就無法體現出視頻播放的效果了。官方文檔中對這個參數的解釋是:

-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).

-i :這個參數表示輸入 ,后面/home/lee/video.mp4 就是輸入文件。

-vcodec copy : -vcodec表示使用的視頻編解碼器 ,前綴v表示video。后面緊跟的copy 表示復制使用源文件的視頻編解碼器,比如原文件的編解碼器(codec)是h264,則這里就使用h264。

-acodec copy : -acodec表示使用的音頻編解碼器,前綴a表示audio。后面的copy 表示使用源文件的音頻編解碼器。

-b:v 800k : -b:v表示視頻的比特率(bitrate) ,為800k。

-b:a 32k : 表示音頻的比特率為32k。

-f flv : -f表示format ,就是強制輸出格式為flv,這一步其實也叫封裝(mux),封裝要做的事就是把視頻和音頻混合在一起,進行同步。緊跟在后面的rtmp://localhost/videotest 表示輸出的"文件名",這個文件名可以是一個本地的文件,也可以指定為rtmp流媒體地址。指定為rtmp流媒體地址后,則ffmpeg就可以進行推流。

如果推流成功的話,就會輸出下面的信息:

4.png

其中輸出了一些源文件的信息。最下面的是一些幀數據,下面這些幀數據會一直輸出直到視頻推送完畢。

打開新的命令行,輸入:


ffplay rtmp://localhost/videotest

表示使用ffplay 來播放指定流媒體文件。ffplay 是ffmpeg 中自帶的媒體播放程序。然后就可以看到下面的視頻了

5.png

推流成功后,在任何支持rtmp流媒體協議的播放器都可以播放,成功在安卓設備上播放了剛剛推流到服務器上的視頻。我本身是一名安卓開發者,我在安卓中使用了七牛云的開源播放器PLDroidPlayer ,下面是運行的截圖。

2017-11-13_230552.png

后記:ffmpeg真是博大精深啊,不僅提供了強大的命令行工具ffmpeg , ffprobe , ffplay, ffserver 方便我們對音視頻進行處理(其實使用ffserver也可以搭建流媒體服務器)。ffmpeg還提供了底層豐富的API ,這一方面內容我還需要深入學習。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374