Mac上搭建直播服務器Nginx+rtmp


這段時間在看直播的項目,在自己的電腦上搭建了Nginx+rtmp直播服務器,記錄了一下安裝步驟,分享給大家並且作備忘:

 

首先,單純從技術角度來看,能夠實現直播功能協議中,比較常用的是RTMP HLS HTTP這三種技術,

但具體到應用場景,他們又會有一些不同的選擇。

我們可以通過以下資料來了解這三種協議的區別及各自的應用領域

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;
        }
    }
}
    1. rtmp是協議名稱
    2. server 說明內部中是服務器相關配置
    3. listen 監聽的端口號, rtmp協議的默認端口號是1935
    4. application 訪問的應用路徑是 zbcs
    5. live on; 開啟實時
    6. 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的延遲。參考資料:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html

找到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支持結束
    }
}

說明:

  1. live on; 開啟實時
  2. hls on; 開啟hls
  3. hls_path; ts文件存放路徑
  4. 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

 

 

 

參考資料一

參考資料二

參考資料三




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM