幾個名詞的解釋
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
如果終端上提示
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