這段時間在看直播的項目,在自己的電腦上搭建了Nginx+rtmp直播服務器,記錄了一下安裝步驟,分享給大家並且作備忘:
首先,單純從技術角度來看,能夠實現直播功能協議中,比較常用的是RTMP HLS HTTP這三種技術,
但具體到應用場景,他們又會有一些不同的選擇。
我們可以通過以下資料來了解這三種協議的區別及各自的應用領域
1、安裝Homebrow
Homebrew簡稱brew,是Mac OSX上的軟件包管理工具,能在Mac中方便的安裝軟件或者卸載軟件,可以說Homebrew就是mac下的apt-get、yum神器,
安裝方式:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果已經安裝過,而想要卸載:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
2、安裝Nginx服務器
增加對 nginx 的擴展;也就是從github上下載,home-brew對ngixnx的擴展
/****error*****/
brew tap homebrew/nginx
但是這個會報錯:Error: homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.
隨后換了個github的項目(https://github.com/denji/homebrew-nginx)成功了:
brew tap denji/nginx
3、安裝Nginx服務器和rtmp模塊
brew install nginx-full --with-rtmp-module
這個安裝,耗時相對來說比較長。通過操作以上步驟nginx和rtmp模塊就安裝好了,下面開始來配置nginx的rtmp模塊。
首先來看看我們的nginx安裝在哪里
brew info nginx-full
通過上面指令我們可以看到以下信息:

- nginx安裝所在位置 /usr/local/Cellar/nginx-full/1.10.1/bin/nginx
- nginx配置文件所在位置 /usr/local/etc/nginx/nginx.conf
- nginx服務器根目錄所在位置 /usr/local/var/www
執行命令 ,測試下是否能成功啟動nginx服務
nginx
會看到一下信息:
在瀏覽器地址欄輸入:http://localhost:8080

出現Welcome to nginx ,代表nginx安裝成功了。
4、配置rtmp
用Xcode打開nginx.conf, 找到/usr/local/etc/nginx/nginx.conf 文件,拖入到Dock中的Xcode,就可以打開.
或者打開Finder Shift + command + G前往,用記事本工具打開nginx.conf.
http { …… } #在http節點下面(也就是文件的尾部)加上rtmp配置: rtmp { server { listen 1935; application zbcs { live on; record off; } } }
- rtmp是協議名稱
- server 說明內部中是服務器相關配置
- listen 監聽的端口號, rtmp協議的默認端口號是1935
- application 訪問的應用路徑是 zbcs
- live on; 開啟實時
- record off; 不記錄數據
5. 保存文件后,重新加載nginx的配置文件
nginx -s reload
6. 安裝ffmepg工具
brew install ffmpeg
安裝這個需要等一段時間, 這時你可以准備一個視頻文件作為來推流,然后安裝一個支持rtmp協議的視頻播放器.Mac下可以用 VLC(點擊下載)
7、通過ffmepg命令進行推流
ffmpeg -re -i 你的視頻文件的絕對路徑(如/Users/lideshan/Downloads/Demo.mp4) -vcodec copy -f flv
rtmp://localhost:1935/zbcs/room
// 如:ffmpeg -re -i /Users/gao/Desktop/112211.mp4 -vcodec copy -f flv rtmp://localhost:1935/zbcs/room
這里zbcs是上面的配置文件中,配置的應用的路徑名稱;后面的room可以隨便寫
但是我們在這里會發現運行這個指令沒有用,會提示cannot find ffmpeg
剛開始我以為是ffmepg沒有裝好 於是又裝了一次 然后會提示什么ffmpeg已安裝 只是沒有激活什么的 這里當時忘記截圖了 反正他會給你一個指令 告訴你輸入這個指令來激活ffmpeg
但是當我們輸入這個指令后也卻提示沒有權限
Error: /usr/local must be writable!
然后看到網上有什么說用超級管理員權限來執行語句
(sudo chown -R $(whoami) /usr/local)
但是這種方法對於高版本的OS來說,是解決不了的,會報chown: /usr/local: Operation not permitted錯誤。
出現這個權限問題是因為10.11以后的系統中,蘋果為了保證數據安全不被篡改,不管普通管理員還是root 都不能更改系統文件的讀寫權限與更改組權限
要想更改這個安全設置可以通過終端修改
開機按住Command+R,進入恢復模式,打開terminal 輸入 >csrutil disable >reboot //重啟
但是我這邊沒有用這個方法,而是先卸載已安裝的homebrew,命令如下:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
然后重新安裝:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
通過該方法直接獲取最新的homebrew,出現預期效果。
也就是再走一遍安裝流程,不知道其他人能不能通過這個方法解決 不能的話可以通過修改系統安全設置來進行操作
接下來我們在執行推流命令:
ffmpeg -re -i /Users/gao/Desktop/112211.mp4 -vcodec copy -f flv rtmp://localhost:1935/zbcs/room
就可以看到終端界面變成這樣:

這說明現在服務器正在推流
8. 驗證視頻
然后電腦上打開vlc這個播放器軟件 點擊File---->Open Network 在彈出來的框中選擇Network然后輸入URL:
rtmp://localhost:1935/zbcs/room

HLS 直播流配置
HLS直播延時
我們知道hls協議是將直播流分成一段一段的小段視頻去下載播放的,所以假設列表里面的包含5個ts文件,每個TS文件包含5秒的視頻內容,那么整體的延遲就是25秒。因為當你看到這些視頻時,主播已經將視頻錄制好上傳上去了,所以時這樣產生的延遲。當然可以縮短列表的長度和單個ts文件的大小來降低延遲,極致來說可以縮減列表長度為1,並且ts的時長為1s,但是這樣會造成請求次數增加,增大服務器壓力,當網速慢時回造成更多的緩沖,所以蘋果官方推薦的ts時長時10s,所以這樣就會大改有30s的延遲。參考資料:
找到http-->server,在花括號中增加
server { listen 8080; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #HLS配置開始,這個配置為了`客戶端`能夠以http協議獲取HLS的拉流 location /hls { # Serve HLS fragments types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root html; add_header Cache-Control no-cache; } #HLS配置結束 #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; } }
找到rtmp下的server在花括號中增加
#在http節點下面(也就是文件的尾部)加上rtmp配置: rtmp { server { listen 1935; application zbcs { live on; record off; } #增加對HLS支持開始 application hls { live on; hls on; hls_path /usr/local/var/www/hls; hls_fragment 5s; } #增加對HLS支持結束 } }
說明:
- live on; 開啟實時
- hls on; 開啟hls
- hls_path; ts文件存放路徑
- hls_fragment 5s; 每個TS文件包含5秒的視頻內容
保存配置文件,重新加載nginx配置
nginx -s reload
進行推流
ffmpeg推流還是和上一篇的一樣,不過,我們需要推到新配置的hls中,movie 關鍵字可以任何替換
ffmpeg -re -i /Users/gao/Desktop/112211.mp4 -vcodec copy -f flv rtmp://localhost:1935/hls/movie
然后,我們在就可以在這個目錄下(這個也是Nginx下html默認配置文件)
/usr/local/var/www/hls
看到生成一個個ts的文件,還會生成一個”你的m3u8的文件名稱.m3u8“的文件

測試拉流
通過上面的配置,我們可以同時通過rtmp和hls兩種播放方式來看到推出來的流。注意,如果使用 http 方式,則是監聽的 8080 端口,這個是在配置文件里寫的
(1) 用rtmp:(使用VLC驗證播放)
rtmp://192.168.1.100/hls/movie
(2) 用hls播放
http://192.168.1.100:8080/hls/movie.m3u8
對於hls拉流,除了使用VLC播放之后,我們還可以在Safari瀏覽器里輸入上面的地址直接播放,也可以用iPad或者iPhone上的Safari來訪問(需要把localhost改為nginx的所在電腦的ip地址)
注意 這里的ip不是固定的
192.168.1.100
要根據自己的本地ip選擇
報錯處理
1.ffmepg命令推流的時候,提示連接失敗。[tcp @ 0x7ff162504b60] Connection to tcp://localhost:1935 failed (Connection refused), trying next address
出現這個錯,是因為配置了nginx.conf后,需要重啟nginx。輸入命令重啟后就沒有問題了
nginx -s reload
2.安裝完nginx后,在瀏覽器地址欄輸入:http://localhost:8080 顯示打不開網頁
解決方式:由於安裝后nginx服務器,有時需要等上幾分鍾才生效。如果還不生效,測試下是否能成功啟動nginx服務,命令
nginx
