視頻直播| 搭建一個本地nginx服務(wù)器以及實現(xiàn)推流和拉流

幾個名詞的解釋

CDN:
    CDN全稱:Content Delivery Network或Content Ddistribute Network,
    即內(nèi)容分發(fā)網(wǎng)絡(luò)基本思路:盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),
    使內(nèi)容傳輸?shù)母臁⒏€(wěn)定。通過在網(wǎng)絡(luò)各處放置節(jié)點服務(wù)器所構(gòu)成的在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò),
    CDN系統(tǒng)能夠?qū)崟r地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點的連接、
    負載狀況以及到用戶的距離和響應(yīng)時間等綜合信息將用戶的請求重新導(dǎo)向離用戶最近的服務(wù)節(jié)點上。
    目前國內(nèi)最大的CDN服務(wù)商應(yīng)該是網(wǎng)宿

Nginx:
    Nginx是一款輕量級服務(wù)器/反向代理服務(wù)器及電子郵件代理服務(wù)器,并在一個BSD-like 協(xié)議下發(fā)行。
    其特點是占有內(nèi)存少,并發(fā)能力強。

RTMP:
    RTMP(Real Time Messaging Protocol)實時消息傳送協(xié)議是Adobe Systems公司為Flash播放器和服務(wù)器之間
    音頻、視頻和數(shù)據(jù)傳輸 開發(fā)的開放協(xié)議。.這個協(xié)議建立在TCP協(xié)議或者輪詢HTTP協(xié)議之上,是一個協(xié)議族,
    包括RTMP基本協(xié)議及RTMPT/RTMPS/RTMPE等多種變種
    它有多種變種:
    1)RTMP工作在TCP之上,默認使用端口1935;
    2)RTMPE在RTMP的基礎(chǔ)上增加了加密功能;
    3)RTMPT封裝在 HTTP請求之上,可穿透 防火墻;
    4)RTMPS類似RTMPT,增加了TLS/SSL的安全功能;

ijkplayer:
    因為 iOS 自帶的 AVplayer 不支持 rtmp 格式的視頻流播放,所以我們需要使用第三方庫。
    GitHub 中開源又常見的 rtmp 流播放器中,較為成熟的是 bilibili 開源的 ijkplayer
    它基于 ffmpeg,支持 Android 和 iOS,視頻流和本地視頻的播放都很強大

ffmpeg:
    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。
    項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。

H.264:

    H.264最大的優(yōu)勢是具有很高的數(shù)據(jù)壓縮比率,在同等圖像質(zhì)量的條件下,H.264的壓縮比是MPEG-2的2倍以上,
    是MPEG-4的1.5~2倍。舉個例子,原始文件的大小如果為88GB,采用MPEG-2壓縮標準壓縮后變成3.5GB,壓縮比為25∶1,
    而采用H.264壓縮標準壓縮后變?yōu)?79MB,從88GB到879MB,H.264的壓縮比達到驚人的102∶1。
    ## H264是一種高壓縮率的編碼標準,如何壓縮嘞?一般的視頻采集都是25幀/秒,
    ## 也就是每秒截圖25次,其實每一張圖片的內(nèi)容都相差不大,壓縮的辦法就是利用算法,
    ## 只將每張圖片變動差異化的部分保存下來,這樣視頻文件就小多了

    低碼率(Low Bit Rate)對H.264的高的壓縮比起到了重要的作用,和MPEG-2和MPEG-4 ASP等壓縮技術(shù)相比,
    H.264壓縮技術(shù)將大大節(jié)省用戶的下載時間和數(shù)據(jù)流量收費。
    尤其值得一提的是,H.264在具有高壓縮比的同時還擁有高質(zhì)量流暢的圖像,
    正因為如此,經(jīng)過H.264壓縮的視頻數(shù)據(jù),在網(wǎng)絡(luò)傳輸過程中所需要的帶寬更少,也更加經(jīng)濟。

    H.265是新的編碼協(xié)議,也即是H.264的升級版。
    他們核心區(qū)別的可以分兩步看:
    1同樣的畫質(zhì)和同樣的碼率,H.265比H2.64 占用的存儲空間要少理論50%。
    2如果存儲空間一樣大,那么意味著,在一樣的碼率下H.265會比H2.64 畫質(zhì)要高一些理論值是30%~40%
    據(jù)說能節(jié)省一半帶寬,但需要機器更強的運算能力。

FFmpeg和h.264是什么關(guān)系?
     H.264是標準(包含編碼、解碼),x264是標準的實現(xiàn)(只實現(xiàn)了編碼),ffmpeg是一個框架,
     但是里面包含了H.264的解碼實現(xiàn),所以ffmpeg + x264 就包含了H.264的編碼、解碼的實現(xiàn)了。

mac搭建naginx+rtmp服務(wù)器

原想用mac中自帶的Apache搭建,但是naginx是輕量級的,同樣起web 服務(wù),也比apache 占用更少的內(nèi)存及資源,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能,用它來做hls或者rtmp流媒體服務(wù)器是非常不錯的選擇.

一、使用Homebrow安裝 nginx

(1)執(zhí)行克隆命令,github的項目(https://github.com/denji/homebrew-nginx)

 brew tap denji/nginx

注意brew tap homebrew/nginx報下面的錯誤,homebrew/nginx已經(jīng)棄用. 報錯:Error: homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.

(2)執(zhí)行安裝命令:

brew install nginx-full --with-rtmp-module  

至此nginx和rtmp模塊就安裝好了,下面開始來配置nginx的rtmp模塊
接下來看一下nginx安裝在什么地方

brew info nginx-full  

nginx安裝所在位置:

 /usr/local/opt/nginx-full/bin/nginx  

nginx配置文件所在位置:

/usr/local/etc/nginx/nginx.conf  

(3)啟動nginx,執(zhí)行命令:

sudo  nginx

二、測試:

在瀏覽器中打開如下地址:http://localhost:8080
出現(xiàn)以上界面,說明安裝成功.

如果終端上提示

nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)  

則表示8080端口被占用了, 查看端口PID

lsof -i tcp:8080  

kill掉占用8080端口的PID

kill 9603(這里替換成占用8080端口的PID)  

三.重新加載nginx的配置文件

(1)修改nginx.conf這個配置文件,配置rtmp
復(fù)制nginx配置文件所在位置:

vi /usr/local/etc/nginx/nginx.conf  

(2)執(zhí)行上面命令會直接編輯,或者直接前往當前文件用記事本打開.
滾動到最后面(最后一個}后面即可,不能在{}里面),添加一下代碼,進行配置,最后記得保存。

rtmp {  
  server {  
      listen 1935;  
    #直播流配置  
      application rtmplive {  
          live on;  
          #為 rtmp 引擎設(shè)置最大連接數(shù)。默認為 off  
          max_connections 1024;  
       }  
      application hls{  
          live on;  
          hls on;  
          hls_path /usr/local/var/www/hls;  
          hls_fragment 1s;  
      }  
   }  
}  

(3)編輯完成之后,執(zhí)行一下重新加載配置文件命令:

 sudo nginx -s reload

需要輸入開機密碼 sudo不加的話會報錯: nginx: [alert] could not open error log file: open() "/usr/local/var/log/nginx/error.log" failed (13: Permission denied)

該命令執(zhí)行后會出來一個彈框詢問是否允許 nginx 加入到網(wǎng)絡(luò)中,選擇允許即可。

(4)重啟nginx:

sudo /usr/local/opt/nginx-full/bin/nginx -s reload  

PS:如果你之前不是按照我上面的方法按照的 nginx,在執(zhí)行 sudo nginx -s reload 時報了如下錯,建議你卸載 nginx后按照我上面的步驟重新安裝nginx。
nginx: [emerg] unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:119

nginx常用方法:

重新加載配置文件:  nginx -s reload
重新加載日志:     nginx -s reopen 
停止 nginx:      nginx -s stop  
有序退出 nginx:   nginx -s quit  

出現(xiàn)權(quán)限不足的錯誤提示時,命令前加上 sudo

四、安裝ffmepg工具

brew install ffmpeg


上圖表示ffmepg安裝完成

五、本地推流

(1)、搭建本地視頻直播,比如電腦上面有很多電影,我們可以通過推流的形式實現(xiàn)實時直播:

A:在電腦上播放推流內(nèi)容
安裝一個支持rtmp協(xié)議的視頻播放器,Mac下可以用VLC
下載VLC
本地下載一個視頻文件路徑為 /Users/iOS002/Desktop/loginmovie.mp4
執(zhí)行以下命令

ffmpeg -re -i /Users/iOS002/Desktop/loginmovie.mp4  -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room

用vlc 然后打開 VLC 中 的 file -- Open Network, 直接輸入代碼中的 url:

rtmp://localhost:1935/rtmplive/room

即可以通過VLC來播放終端中實時推過來的 RTMP流。

效果如圖

B:通過手機觀看電腦的推流
通過集成 ijkplayer 把地址換成推流的地址即可觀看:
播放端用的針對RTMP優(yōu)化過的ijkplayer,ijkplayer是基于FFmpeg的跨平臺播放器,這個開源項目已經(jīng)被多個 App 使用,其中映客、美拍和斗魚使用了 ijkplayer

(2)、桌面錄制或者分享

ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/room 

(3)、桌面+麥克風

ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/room

(4)、桌面+麥克風,并且還要攝像頭拍攝到自己

ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:2016/rtmplive/room  

六、手機推流

可以用 LFLiveKit 集成到工程進行推流,LFLiveKit已經(jīng)幫我們實現(xiàn)了視頻采集、后臺錄制、美顏功能、支持h264、AAC編碼,動態(tài)改變速率,RTMP傳輸?shù)龋覀冮_發(fā)的時候就很簡單了只需把localhost:8080換成自己電腦的ip地址即可:

 rtmp://10.0.0.17:1935/rtmplive/room

注意通過網(wǎng)絡(luò)查看電腦的局域網(wǎng) IP替換掉 localhost 即可。

A:通過VLC觀看手機的推流
打開手機直播后,然后在電腦上打開VLC(同上),就能實現(xiàn)手機推流,在電腦上拉流播放了!!(注:手機需要和電腦連接同一網(wǎng)絡(luò)!)

B:通過手機觀看手機的推流(這也就是市面上的那些直播App的最終實現(xiàn)形式了)
通過集成 ijkplayer 把地址換成推流的地址即可觀看。

PS:一個很隱蔽的報錯:

如果你發(fā)現(xiàn)你的推流地址和拉流地址在電腦上都是好好的,但是通過手機實現(xiàn)的時候就是報錯,那么估計就是因為Mac防火墻的問題。

ERROR: PILI_RTMP_Connect0, failed to connect socket. 60 (Operation timed out)
ERROR: WriteN, PILI_RTMP send error 9, Bad file descriptor, (140 bytes)
ERROR: PILI_RTMP_Connect0, failed to connect socket. 60 (Operation timed out)
ERROR: WriteN, PILI_RTMP send error 9, Bad file descriptor, (140 bytes)

關(guān)閉 Mac 的防火墻即可解決問題。


較好的文章:
大牛直播SDK 5000+star
iOS視頻直播初窺:高仿<喵播APP>
快速集成iOS基于RTMP的視頻推流
https://github.com/SunLiner/MiaowShow

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。