推流服務器主要是使用了開源的nginx和rtmp模塊,網上也有很多資料,不過對有些可能出現的問題沒有很好的總結。
安裝brew
使用Mac進行開發很久的老司機應該對這個工具很熟悉了。brew是一個第三方的軟件的管理工具。基於Ruby語言。若你的Mac已經安裝,則跳過該步驟吧。
具體安裝如下
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 1
安裝nginx模塊
執行如下命令
brew tap homebrew/nginx
- 1
好的,麻煩來了,如果不是root用戶的話。肯定會出現權限錯誤的問題
錯誤如下
fatal: could not create work tree dir '/usr/local/Library/Taps/homebrew/homebrew-nginx'.: Permission denied Error: Failure while executing: git clone https://github.com/Homebrew/homebrew-nginx /usr/local/Library/Taps/homebrew/homebrew-nginx --depth=1
- 1
- 2
這個時候可能覺得加一個sudo就好了。有的電腦確實可以,不過這個似乎是brew的一個bug。對文件夾的的權限做一下修改就好。讓當前用戶對/usr/local
有讀寫權限。
sudo chown -R $USER /usr/local
- 1
安裝rtmp模塊
安裝rtmp也是只需要使用如下命令就好了
brew install nginx-full --with-rtmp-module
- 1
如果不幸的話,到這一步錯誤又來了。看log同樣是權限的問題
==> Installing nginx-full from homebrew/nginx Error: Permission denied - /Library/Caches/Homebrew/Formula/nginx-full.brewing
- 1
- 2
同樣是文件夾權限的問題。修改文件夾的權限就可以
sudo chown -R ${USER} /Library/Caches/Homebrew/
- 1
好的,權限問題解決了,繼續執行一下安裝的命令。不幸運的話錯誤又來了,錯誤的log如下:
curl: (35) Server aborted the SSL handshake Error: Failed to download resource "rtmp-nginx-module" Download failed: https://codeload.github.com/sergey-dryabzhinsky/nginx-rtmp-module/tar.gz/v1.1.7.10
- 1
- 2
- 3
還好這個問題不常見,引起的原因是brew版本太低的原因,所以不支持https協議,所以需要升級一下brew。升級的命令如下
brew update
- 1
好的,然后繼續執行安裝命令,開始安裝了,可是過了一會又不行了。錯誤如下:
curl: (7) Failed to connect to codeload.github.com port 443: Operation timed out Error: Failed to download resource "rtmp-nginx-module" Download failed: https://codeload.github.com/sergey-dryabzhinsky/nginx-rtmp-module/tar.gz/v1.1.7.10
- 1
- 2
- 3
引起的原因是使用了一個PHP的依賴庫,然后被牆了,真是有意思。具體怎么解決,大家都知道了。
nginx配置
查看nginx相關信息
在啟動之前我們需要知道nginx安裝的目錄和目錄。
執行如下命令
brew info nginx-full
- 1
可能會輸出很多無用的信息,不過對我們真正比較有用的是==> Caveats
后面的這一部分
Docroot is: /usr/local/var/www The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that nginx can run without sudo. nginx will load all files in /usr/local/etc/nginx/servers/. - Tips - Run port 80: $ sudo chown root:wheel /usr/local/Cellar/nginx-full/1.10.1/bin/nginx $ sudo chmod u+s /usr/local/Cellar/nginx-full/1.10.1/bin/nginx Reload config: $ nginx -s reload Reopen Logfile: $ nginx -s reopen Stop process: $ nginx -s stop Waiting on exit process $ nginx -s quit To have launchd start homebrew/nginx/nginx-full now and restart at login: brew services start homebrew/nginx/nginx-full Or, if you don't want/need a background service you can just run: nginx
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
從信息可以看到。nginx安裝的目錄為/usr/local/Cellar/nginx-full
,nginx配置文件為/usr/local/etc/nginx/nginx.conf
,nginx服務器根目錄所在位置為/usr/local/var/www
。
啟動nginx
執行如下命令即可啟動nginx
/usr/local/Cellar/nginx-full/1.10.1/bin/nginx
- 1
打開瀏覽器輸入http://localhost:8080
,如果顯示如下界面則說明安裝成功了。
配置nginx.conf文件
打開nginx.conf文件。在http節點后面配置:
rtmp {
server {
listen 1935; application joyseedog{ live on; record off; } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
application后面的名字自己可以做修改。
然后重新加載一下nginx。如果沒有啟動nginx則可能會報錯,系統可能找不到進程。
/usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload
- 1
進行電腦端本地推流測試
電腦端我們使用推流我們可以通過ffmepg來進行。
安裝ffmepg
通過一個命令就可以安裝了,最好是提前准備好梯子。似乎有些組件也是下載不下來。
brew install ffmpeg
- 1
通過ffmepg命令進行推流
推流的命令如下
ffmpeg -re -i /Users/jianquan/Movies/IMG_1111.MOV -vcodec copy -f flv rtmp://localhost:1935/joyseedog/room1
- 1
- 2
-i后面是自己視頻的地址,room1可以修改,joyseedog可以修改,不過需要和nginx.conf里面配置的一樣
查看推流結果
需要使用一個支持rtmp協議的播放軟件,在Mac上我們可以使用Vlc。google一下就可以找到安裝包。安裝結束后,打開vlc,點擊File
—->Open Network
在彈出來的框中選擇Network然后輸入URL:
然后就可以播放推出來的視頻了。
效果如下:
手機端進行推流
手機端推流使用的是LiveVideoCoreSDK,github地址如下LiveVideoCoreSDK。
我們只需要修改ViewController.m
里面的rtmp地址為自己發Mac的推流地址即可實現推流
- (void)viewDidLoad { [super viewDidLoad]; [self UIInit]; _RtmpUrlTextField.text = @"rtmp://124.193.167.51:1935/joyseedog/room1"; }
- 1
- 2
- 3
- 4
- 5
- 6
必須使用真機進行測試,當手機端連接后,RTMP轉態變為已連接
如圖
我們可以打開終端,看看連接的情況,連接使用的是1935端口
使用lsof -i:1935
命令查看端口的具體連接情況;
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 17252 jianquan 7u IPv4 0xc5066a9dfda55bdb 0t0 TCP *:macromedia-fcs (LISTEN) nginx 17259 jianquan 3u IPv4 0xc5066a9e054077bb 0t0 TCP 10.2.48.21:macromedia-fcs->192.168.2.86:51553 (ESTABLISHED) nginx 17259 jianquan 7u IPv4 0xc5066a9dfda55bdb 0t0 TCP *:macromedia-fcs (LISTEN)
- 1
- 2
- 3
- 4
可以看到,10.2.48.21是服務器地址,192.168.2.86:51553手機的地址已經建立了TCP連接。同時還要兩個進程在監聽等待連接。
同樣,我們可以使用VLC對推流視頻進行播放,需要注意的是,LiveVideoCoreSDK里面的IP地址不能寫localhost,但是在Mac上的rtmp進行播放測試時候,寫IP地址或是localhost都是可以的。
會有3秒左右的延遲,具體效果如下:
點擊退出后再次查看端口:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 17252 jianquan 7u IPv4 0xc5066a9dfda55bdb 0t0 TCP *:macromedia-fcs (LISTEN) nginx 17259 jianquan 7u IPv4 0xc5066a9dfda55bdb 0t0 TCP *:macromedia-fcs (LISTEN)
- 1
- 2
- 3
可以看到建立的TCP連接已經斷開,剛才的連接已經不在了。
總結
本文在前人的基礎上,實踐並總結了Mac搭建推流服務器,並使用本地推流和第三方框架LiveVideoCoreSDK在iOS設備上對推流服務器進行了測試。該推流服務器不可直接用於工業生產中,不過對於iOS程序員自己測試推流功能會有一定幫助。