rtmp测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)
0.引言
關注我的朋友,應該都知道,前面我們講解了如何搭建srs流媒體服務器,鏈接如下。由于srs流媒體服務器是不支持多碼率測試環(huán)境,所以不能在上次的環(huán)境上繼續(xù)演示。那本篇文章就要給出一個新方案,就是使用Nginx+Rtmp模塊+Hls來演示,在流媒體服務器上,如何使用多碼率(實際項目中,也很多這樣使用)。那就跟我一起好好學吧。也有很多人寫關于流媒體文章,但干貨的文章太少,我希望把盡量多的干貨,分享給大家,這樣想學習的朋友,才會進步更快。
環(huán)境準備提醒:
如果你還沒有搭建ubuntu系統(tǒng),那請參考第(4)步。如果ubuntu系統(tǒng)搭建好了,還沒有搭建ffmpeg在win和ubuntu的環(huán)境,請參考第(5)步和第(3)步。如果前面幾步都做好了,一般就可以本文的環(huán)境搭建了。至于第(1)和第(2)步,是針對srs流媒體服務器環(huán)境搭建,如果要學習hls和srs流媒體服務器,第(1)和第(2)步是必須要學習。
在搭建環(huán)境的過程中,也遇到過不少坑,我把這些坑也在文章中整理出來了,希望能夠幫到大家,如果大家覺得有用,可以關注,后面還會有更多實用的流媒體文章,供大家學習。遇到問題一定不要慌,需要思考問題出現(xiàn)在哪里,一個個排查。
(1) 手把手搭建流媒體服務器詳細步驟
(2) 手把手配置HLS流媒體服務器
(3) 超詳細手把手搭建在ubuntu系統(tǒng)的FFmpeg環(huán)境
(4) 最快系統(tǒng)搭建:Vmware、ubuntu18.0及常用軟件安裝
(5) 手把手搭建FFmpeg的Windows環(huán)境
1.搭建多碼率流程
要實現(xiàn)多碼率測試,主要經過以下一些流程。
(1)推流端,推流上去,可以使用obs,ffmpeg或其它推流工具都可以。
(2)流媒體服務器端,對推上去的流,轉碼,實現(xiàn)超高清,高清,標清的碼流。如暫定300kB碼流是超高清,200kB是高清,100Kb是標清。同時,帶寬也是需要配置,也就是說,根據(jù)不同的帶寬來拉取不同碼率的流。
(3)使用ffplay或其它播放工具去拉取碼流,在播放端可以自由選擇或單獨拉取超高清,高清,標清。實現(xiàn)了市面上很多播放器的自適應方案。如果使用ffplay播放,ffplay里的快捷鍵使用如下,如按鍵盤的“C”鍵可以切換碼流。ffplay快捷鍵,如下圖所示:
master列表,代表有不同碼率。
根據(jù)master列表,找到真正的playlist,如下圖:
2 搭建nginx-rtmp開源項?
(1) 關于項目搭建,一定要知道這個地址,可以在原生的基礎上,支持flv-module。相當于(1)是在(2)的基礎上做的二次開發(fā)。如下:
nginx-http-flv-module(增加新功能)地址:https://github.com/winshining/nginx-http-flv-module
其github界面如下:
(2)關于nginx-rtmp-module(功能要少),原來的官網地址如下。
nginx-rtmp-module(功能要少)地址:https://github.com/arut/nginx-rtmp-module。
其github界面如下:
(3) nginx-http-flv-module的其他功能與nginx-rtmp-module的對?,對比看看,在原生的基礎上,增加了哪些新功能。圖中" 根號"表示新增加功能,"X"表示原生不支持,對比下,就知道這個新增加的功能還是很實用的。如果你有更好的方案,可以告訴我,我們一起交流。如下圖:
3. 安裝依賴庫
安裝系統(tǒng)相關的依賴庫。如果你的系統(tǒng)都已經具備了這些庫,可以不用理會。也可以先安裝后面的步驟,如果發(fā)現(xiàn)缺少庫,再回來安裝這些庫。命令如下:
sudo apt-get update#安裝依賴:gcc、g++依賴庫sudo apt-get install build-essential libtool #安裝 pcre依賴庫(http://www.pcre.org/) sudo apt-get install libpcre3 libpcre3-dev#安裝 zlib依賴庫(http://www.zlib.net)sudo apt-get install zlib1g-dev#安裝ssl依賴庫sudo apt-get install openssl4. 安裝nginx-http-flv-module
安裝nginx-http-flv-module,也就是前面所說的,增加了很多新功能的版本。
(1)打開ubuntu系統(tǒng),在相應的目錄下,創(chuàng)建相應的文件,如我創(chuàng)建的如下:
執(zhí)行命令:
mkdir rtmp-nginx
執(zhí)行界面如下:
(2)進入上面創(chuàng)建的文件夾,下載nginx-http-flv-module
執(zhí)行命令:
cd rtmp-nginx
執(zhí)行界面如下:
(3)下載nginx-http-flv-module,執(zhí)行命令:
git clone https://github.com/winshining/nginx-http-flv-module.git
執(zhí)行界面如下:
下載完后,界面如下:
注意:如果下載過程中,網絡較慢,耐心等待。
(4) 查看當前目錄是否有,執(zhí)行命令:
ls
界面如下:
(5)在當前目錄,下載nginx
在下載nginx之前,一定要安裝ssl,否則會出錯。這里先給出本小節(jié)所有的命令,后面再逐一演示。
#下載nginx 1.19.2版本wget http://nginx.org/download/nginx-1.19.2.tar.gz tar xvzf nginx-1.19.2.tar.gz cd nginx-1.19.2/ # 配置,?定要?持https,安裝目錄可以實時修改 ./configure --prefix=/usr/local/rtmp-nginx --with-http_ssl_module--add-module=/home/qaa/share/rtmp-nginx/nginx-http-flv-module # 編譯 make#安裝 sudo make install 最終安裝到?錄:/usr/local/rtmp-nginx/nginx 目的:主要是避免和原有的nginx有沖突(如果你系統(tǒng)還有其它版本)(6)下載nginx 1.19.2版本
執(zhí)行命令:
wget http://nginx.org/download/nginx-1.19.2.tar.gz
界面如下:
(7) 在當前目錄下,查看是否有下載到當前目錄。
執(zhí)行命令:
ls
界面如下:
(8) 在當前目錄下,解壓下載好的nginx,執(zhí)行解壓命令:
tar xvzf nginx-1.19.2.tar.gz
界面如下:
(9) 解壓完成后,執(zhí)行命令:
ls
如下界面:
(10) 進入nginx-1.19.2目錄下,執(zhí)行命令:
cd nginx-1.19.2/
如下界面:
(11) 創(chuàng)建nginx安裝目錄,目的是為了與以前默認安裝在系統(tǒng)目錄的nginx或其它版本的nginx,做區(qū)分,在如下路徑,執(zhí)行命令:
mkdir rtmp-nginx
如下界面:
(12)回到目錄/home/qaa/share/rtmp-nginx/nginx-1.19.2,并執(zhí)行如下命令:
./configure --prefix=/usr/local/rtmp-nginx --with-http_ssl_module --add-module=/home/qaa/share/rtmp-nginx/nginx-http-flv-module
如下界面:
注意:添加module的目錄,一定要配置正確,否則就有可能出錯。
如下界面,就是應為目錄指定錯誤而出了如下錯誤。
(13)繼續(xù)在當前目錄,編譯,執(zhí)行命令:
make
執(zhí)行界面如下:
編譯過程,耐心等待。
編譯完成后,如下提示:
(14)繼續(xù)在當前目錄,執(zhí)行命令:
sudo make install
執(zhí)行界面:
注意這個安裝目錄就是之前創(chuàng)建的目錄(/usr/local/rtmp-nginx),如下:
如果出現(xiàn)如下界面,就代表安裝成功了,并且與以前的nginx版本不沖突。具體的執(zhí)行的路徑就在sbin目錄下。
(15) 在當前目錄下,修改配置文件。
執(zhí)行如下命令
vim conf/nginx.conf
修改為如下:
目前是測試環(huán)境,可以配置為前臺運行,查看相關log信息。如果需要后臺運行可以不修改。
新增 daemon off,就可以配置為前臺運行。
(16) 在當前目錄,啟動nginx。
執(zhí)行如下命令:
sudo sbin/nginx -c conf/nginx.conf
如下界面:
(17) 啟動成功后,我們測試nginx是否安裝成功,在瀏覽器這里測試下。
輸入地址:
http://172.16.204.133:80/
成功安裝nginx后的界面如下:
如果出現(xiàn)如下錯誤,表示端口號被占用,需要修改配置文件的端口號。
錯誤提示如下:
修改配置文件的端口為8081。
(18)Nginx命令相關
如果需要停止nginx,可以執(zhí)行如下命令:
sudo /usr/local/nginx/rtmp-nginx/sbin/nginx -s stop
如果要重新加載配置文件,可以執(zhí)行如下命令:
sudo /usr/local/rtmp-nginx/nginx/sbin/nginx -s reload
5.配置?件
(1)配置文件,這一步很關鍵,我先把配置文件(實測可行)給出來,如下,后面再做詳細解釋。在ubuntu下一定要注意nginx.conf文件書寫格式,否則可能沒辦法拉流。我就碰到過一個坑,就是能夠拉取rtmp流,不能拉取hls流,后來發(fā)現(xiàn)就是格式問題。
daemon off;# 如果開啟off對應的ts文件不并刪除# master_process off; user root;error_log /tmp/error.log debug;events{ worker_connections 1024;}rtmp{ server { listen 1935; chunk_size 4000; #live application live { live on; exec /root/bin/ffmpeg -i rtmp://localhost/live/$name -c:a copy -c:v libx264 -b:v 300K -g 30 -f flv rtmp://localhost/hls/$name_hi-c:a copy -c:v libx264 -b:v 200K -g 30 -s 462x254 -f flv rtmp://localhost/hls/$name_mid-c:a copy -c:v libx264 -b:v 100K -g 30 -s 230x128 -f flv rtmp://localhost/hls/$name_low; } application hls { live on; hls on; hls_path /tmp/hls; hls_nested on; hls_fragment 2s; hls_playlist_length 6s; hls_variant _hi BANDWIDTH=350000; hls_variant _mid BANDWIDTH=250000; hls_variant _low BANDWIDTH=150000; } }}#HTTPhttp{ server { listen 8081; #welcome location / { root html; index index.html index.htm; } #hls location /hls { types { application/vnd.apple.mpegusr m3u8; video/mp2t ts; } #root /tmp; alias /tmp/hls; add_header Cache-Control no-cache; } }}(2)解析配置文件,上面這些配置文件,究竟是干什么呢?作用是什么呢?
首先來看看rtmp模塊的配置,如下圖:
用不同顏色的線連接起來的都是一一對應。
listen 1935:表示rtmp服務默認監(jiān)聽的端口號。
application live:表示直播應用。這里面就是使用ffmpeg做的轉碼,不停地把視頻轉碼為超高清,高清,標清,三份碼流。
$name:表示節(jié)目名稱,這里指的是livestream。
application hls:表示hls應用,與application live中的rtmp://localhost/hls/$name_xxx,一一對應。其中hls_variant _hi與application live中的rtmp://localhost/hls/$name_hi也是一一對應。hls應用中BANDWIDTH=350000,這里與m3u8文件的BANDWIDTH=350000是一一對應。
(3)然后,再看看HTTP模塊,配置文件如下圖所示:
listen 8081:http模塊監(jiān)聽的端口號,默認是80,這里做了修改。
location /:這是使用瀏覽器訪問http,出現(xiàn)默認的網頁(html和index.html),比如如下圖所示:
location /hls:這里與流地址http://xxx:端口號/hls/livestream.m3u8是一一對應。
types:表示m3u8和ts文件類型。
alias /tmp/hls:表示存放m3u8和ts文件路徑。
(4) 進入當前如下目錄
/usr/local/rtmp-nginx/conf
執(zhí)行命令
vim nginx.conf
參照上面的配置文件,對nginx.conf進行修改。
界面如下:
注意:由于修改前后的配置文件,還是有些差別,所以為了保險起見,就把原來的配置文件,進行備份。源文件和備份文件,分別是,如下界面。
通過ffmpeg命令行去轉碼,轉成不同的碼率。這里的音頻并沒有做修改,只是把視頻做了三份不同碼率的,來模擬超高清,高清,標清。
關于分片需要說明下,如果源碼流,幀率是15幀,gop為30,這個時候ts分片至少2秒,因為分片至少是一個完整的gop。下面參數(shù)僅僅供參考,所有參數(shù)都需要根據(jù)實際的需求去配置。
(5)下面參數(shù)的$name就是livestream,在后面超高清,高清,標清的名字就拼接成livestream_hi,livestream_mid,livestream_low。其中rtmp://localhost/hls/$name_low,其中hls對應的就是下面配置的application hls。其中rtmp://localhost/live/$name,其中live對應的就是上面配置的application live。
注意:ffmepg的路徑一定要指定對,否則可能無法生效。我這里ffmpeg的路徑在/root/bin/ffmpeg。
application hls中,大括號中,hls_path /tmp/hls,表示hls的路徑。如下界面:
注意:如果沒有hls文件夾,那就需要再創(chuàng)建一個。
(6) 修改好上述配置文件后,那就再重新執(zhí)行nginx。
在如下路徑:
/usr/local/rtmp-nginx
執(zhí)行命令:
sudo sbin/nginx -c conf/nginx.conf
注意:這里修改后配置文件,不能再使用80端口,重新修改端口為8081,再啟動。否則會端口被占用的錯誤。
修改端口后正確執(zhí)行:
前臺啟動界面:
6.測試
(1)經過前面一番折騰,終于可以測試了。客戶端使用ffmpeg推流。
這里需要搭建win下的ffmpeg開發(fā)環(huán)境,可以看看這篇文章,手把手搭建FFmpeg的Windows環(huán)境
執(zhí)行推流命令:
ffmpeg -re -i time.flv -vcodec copy -acodec copy -f flv -y rtmp://172.16.204.133/live/livestream注意:IP也需要換成你自己的才行。
執(zhí)行界面如下:
(2) RTMP流地址為:
rtmp://172.16.204.133/live/livestream(3) HLS流地址為:
http://172.16.204.133/hls/livestream.m3u8http://172.16.204.133/hls/livestream_hi/index.m3u8(4) 拉流端,可以使用ffplay和vlc進行測試。
我這里就使用ffplay拉流,可以拉取到rtmp流。其中命令為:
ffplay rtmp://172.16.204.133/live/livestream
界面如下:
(5) 拉取hls流:
ffplay http://172.16.204.133/hls/livestream.m3u8
超高清界面如下:
高清界面如下:
標清界面如下:
可以看到這里超高清,高清,標清以及master列表。
注意:使用ffplay拉流,可以按下鍵盤“C”鍵,然后自由切換超高清,高清,標清。
執(zhí)行命令:
cd /tmp/hls
ls
界面如下:
(6) 現(xiàn)在隨便進入一個文件。
執(zhí)行命令:
cd livestream_hi
ls
可以看到這里很多ts文件,這里ts的文件是及時更新,個數(shù)與上面配置的切片個數(shù)有關系,這里設置的6個。界面如下:
(7) 再看看其它目錄
執(zhí)行命令
cd livestream_mid
ls
界面如下:
(8) 再看看其它目錄
執(zhí)行命令
cd livestream_low
ls
界面如下:
ffplay拉取的日志界面如下:
(9) 服務器使用ffmpeg查看轉碼命令,實時查看ffmpeg是否有在運行。
執(zhí)行命令:
sudo ps -ef | grep ffmpeg
要看到如下界面,才說明成功了。否則就是不成功。
使用如下命令,單獨拉取超高清碼流,也是可以:
執(zhí)行命令:
ffplay http://172.16.204.133/hls/livestream_hi/index.m3u8
拉取的日志界面:
注意:這個時候,再按鍵盤"C"鍵是不生效的,因為你已經選定了超高清了,不能再換了。如果要自由切換,那需要上上面的方式。
(10) 如果推流結束,那么/tmp/hls下的就為空了,ts文件都會被及時刪除,也可以配置不刪除。
如下界面:
(11) 在前面配置文件的章節(jié)中,有配置流媒體服務器日志的路徑,通過命令行可以查看。通過日志文件可以排查和定位問題。
執(zhí)行命令:
tail -f error.log
界面如下:
注意:這里就是上面所說的坑的問題,因為格式寫錯,而無法拉取hls流。如果使用右邊書寫有誤的配置文件,ffplay拉流就會出現(xiàn)如下圖404錯誤。
7.碼流切換建議
關于自適應碼率切換,我的建議是,由用戶來選擇,不要幫用戶選擇。當網絡不好時,需要提醒用戶,建議用戶去切換碼流,當網絡良好的時候嗎,再切換回來。如果幫用戶去切換,通過日志發(fā)現(xiàn),碼流會頻繁切換,有時會造成卡頓的現(xiàn)象。
8.模擬丟包測試
如果需要模擬丟包和延遲測試,作些debug,可以按照如下命令去測試:
//1. 延遲設置//延遲 300ms ± 100ms sudo tc qdisc add dev eth0 root netem delay 300ms 100mssudo tc qdisc del dev eth0 root netem delay 300ms 100ms// 2. 丟包 //丟包率 5%sudo tc qdisc add dev eth0 root netem loss 30% sudo tc qdisc del dev eth0 root netem loss 5%界面如下:
9.總結
本文搭建環(huán)境是在前面環(huán)境的基礎上做的,所以需要前面的基礎作為鋪墊。整理這些文章是為了幫助更多想學流媒體,而又遇到很多困難,而放棄的人。希望能夠幫助更多的人,各位朋友的喜歡,才是我分享的動力。
創(chuàng)作、整理實戰(zhàn)型文章不易,如果覺得對你或你的朋友有用,可以關注,轉發(fā),點贊,收藏,分享,評論區(qū)討論。
后期關于項目的知識,會在微信公眾號上更新,如果想要學習項目,可以關注微信公眾號“記錄世界 from antonio”
總結
以上是生活随笔為你收集整理的rtmp测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字符串添加_python字符
- 下一篇: python if else break