@程序員,為你揭開直播技術的神祕面紗

@程序員,為你揭開直播技術的神秘面紗

頭圖 | CSDN 下載自視覺中國

出品 | CSDN(ID:CSDNnews)

隨著Web 2.0 的普及以及移動互聯網技術的發展,各種視頻分享、流媒體直播類型的服務應運而生,例如在線教育、我們會發現今年由於疫情的影響各大學校延遲開學,學生們不得不在家遠程上課。各大企業因為疫情影響在家遠程開會,各種互聯網攝像頭可以讓你隨時隨地看到家裡的動態,那麼你知道這種直播技術它背後的原理嗎?如果你想了解直播技術的背後原理, 歡迎繼續閱讀,我將帶你揭開直播技術的神秘面紗。

@程序员,为你揭开直播技术的神秘面纱

認識直播技術背後的傳輸協議

直播技術背後是由多種基於 IP 網絡的傳輸協議組成,統稱為流媒體網絡傳輸協議,不同的傳輸協議應用的場景不一樣,通過這些傳輸協議對數據進行封裝後傳輸,儘可能的保證音視頻的數據質量和延遲:

RTMP (Real-Time Messaging Protocol,縮寫RTMP)協議,他最早是由Macromedia為通過互聯網在Flash播放器與一個服務器之間傳輸流媒體音頻、視頻和數據而開發的一個專有協議。後來這家公司被Adobe 收購,隨後這個協議也已發佈了不完整的規範供公眾使用。由於其延遲相對較低被廣泛的使用在各種直播平臺上。比如遊戲直播、美女直播、電視直播、在線教育等。RSTP 協議,這種協議一般應用在各種安全監控攝像頭上,比如各種家用的互聯網攝像頭,RTSP(Real Time Streaming Protocol)實時流協議,RTSP協議利用推式服務器(push server)方法,讓音視頻瀏覽端,發出一個請求,網絡攝像機只是不停地向瀏覽端推送封裝成RTP分組的音視頻編碼數據,網絡攝像機可以用很小的系統開銷實現流媒體傳輸。HTTP(HyperText Transfer Protocol)超文本傳輸協議,網絡攝像機通過HTTP協議提供Web訪問功能,很方便地將音視頻數據經過複雜網絡傳輸,但實時音視頻支持很不理想。比如蘋果公司開發的HTTP Live Streaming(縮寫是HLS)就是基於 HTTP 協議來實現的流媒體網絡傳輸協議。它的工作原理是把整個流分成一個個小的基於HTTP的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的extended M3U (m3u8) playlist文件,用於尋找可用的媒體流。HLS只請求基本的HTTP報文,與實時傳輸協議(RTP)不同,HLS可以穿過任何允許HTTP數據通過的防火牆或者代理服務器。它也很容易使用CDN來傳輸媒體流。但是其延遲相較於 RTMP 會比較高。

那通常我們所看到的各種直播平臺都是基於 HLS 或 RTMP 進行的,一般情況下移動端會使用 HLS,兼容性比較好,而 PC 端則使用 RTMP 協議。

@程序员,为你揭开直播技术的神秘面纱

RTMP 是怎麼工作的?

播放一個RTMP的流媒體需要經過以下幾個步驟:

  • 握手

  • 建立連接

  • 建立流

  • 播放

RTMP連接都是以握手作為開始的。建立連接階段用於建立客戶端與服務器之間的“網絡連接”;建立流階段用於建立客戶端與服務器之間的“網絡流”;播放階段用於傳輸視音頻數據。

握手(HandShake)

一個RTMP連接以握手開始,雙方分別發送大小固定的三個數據塊:

  • 握手開始於客戶端發送C0、C1塊。服務器收到C0或C1後發送S0和S1。

  • 當客戶端收齊S0和S1後,開始發送C2。當服務器收齊C0和C1後,開始發送S2。

  • 當客戶端和服務器分別收到S2和C2後,握手完成。

建立網絡連接(NetConnection)

  • 客戶端發送命令消息中的“連接”(connect)到服務器,請求與一個服務應用實例建立連接。

  • 服務器接收到連接命令消息後,發送確認窗口大小(Window Acknowledgement Size)協議消息到客戶端,同時連接到連接命令中提到的應用程序。

  • 服務器發送設置帶寬協議消息到客戶端。

  • 客戶端處理設置帶寬協議消息後,發送確認窗口大小(Window Acknowledgement Size)協議消息到服務器端。

  • 服務器發送用戶控制消息中的“流開始”(Stream Begin)消息到客戶端。

  • 服務器發送命令消息中的“結果”(_result),通知客戶端連接的狀態。

建立網絡流(NetStream)

  • 客戶端發送命令消息中的“創建流”(createStream)命令到服務器端。

  • 服務器端接收到“創建流”命令後,發送命令消息中的“結果”(_result),通知客戶端流的狀態。

播放(Play)

  • 客戶端發送命令消息中的“播放”(play)命令到服務器。

  • 接收到播放命令後,服務器發送設置塊大小(ChunkSize)協議消息。

  • 服務器發送用戶控制消息中的“streambegin”,告知客戶端流ID。

  • 播放命令成功的話,服務器發送命令消息中的“響應狀態” NetStream.Play.Start & NetStream.Play.reset,告知客戶端“播放”命令執行成功。

  • 在此之後服務器發送客戶端要播放的音頻和視頻數據。

播放流

  • 從流媒體服務器下載流進行編碼播放。

@程序员,为你揭开直播技术的神秘面纱

如何搭建一個直播服務?

搭建一個直播服務的方式有很多種,以 nginx 為例,你可以在編譯 nginx 的時候加入 nginx-rtmp-module 模塊來實現 RTMP\\HLS 等實時流,也可以使用類似SRS這樣的開源軟件來實現,下面我將以 nginx 為例來實現一個直播服務器,如果你是使用 nginx,可以參考。

1.首先,我們需要下載 nginx 和 nginx-rtmp-module 模塊:

yum -y install gcc pcre-devel openssl-devel
wget -c https://nginx.org/download/nginx-1.17.9.tar.gz
tar zxvf nginx-1.17.9.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git
cd nginx-1.17.9
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module
make
make install

2.配置 nginx:

rtmp {
server {
listen 1935; # 使用 udp 1935 端口
chunk_size 4096;
application live { # app 名稱為 vod
live on;
}
}
}

更具體的配置,請參考GitHub 的Example nginx.conf,nginx-rmtp-module 還可以配置轉推、錄播、點播等等方式,下面我們啟動 nginx:

[root@localhost sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf

3.接下來,我們需要放行 tcp 1935 端口。

@程序员,为你揭开直播技术的神秘面纱

如何獲取流?

當流媒體服務器搭建完畢之後,我們需要做兩個步驟:

  • 推流:將視頻流編碼後推到rtmp 服務;

  • 拉流:從 rtmp 服務器下載流進行編碼播放。

一個 RTMP 的 URL 格式如下:

rtmp://rtmp.example.com/[app]/[name]

這裡的 app 名稱就是 nginx 中配置的,是固定的值。後面的 name 是可以隨便取的,我們可以按照 FFmpeg 或 obs 軟件來推流,使用 FFmpeg 推流如下:

ffmpeg -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://IP地址/live/test

這段命令:

  • -i 表示加載本地視頻文件

  • -vcodec 指定視頻編碼方式為h264

  • -acodec 指定音頻編碼方式為 aac

  • -f flv 表示強制轉行為 flv 格式推流

如圖所示:

@程序员,为你揭开直播技术的神秘面纱

首先,添加一個場景為媒體源,然後選擇一個本地文件,當然 OBS 還可以添加你的本地顯示器或窗口等等。

@程序员,为你揭开直播技术的神秘面纱

點擊確定後,點擊設置,切換到推流,選擇服務為自定義,填寫服務器地址和串流密鑰,點擊確定,然後點擊開始推流即可。

@程序员,为你揭开直播技术的神秘面纱

當開始推流變成停止推流即表示推流成功:

@程序员,为你揭开直播技术的神秘面纱

最後我們使用 vlc 播放,打開 VLC,使用 Network 方式輸入 url:

@程序员,为你揭开直播技术的神秘面纱
@程序员,为你揭开直播技术的神秘面纱@程序员,为你揭开直播技术的神秘面纱

☞美團十年,支撐全球最大規模外賣配送的一站式機器學習平臺是如何煉成的?

☞比爾·蓋茨退出微軟公司董事會;蘋果 WWDC、微軟 Build 大會均改為線上舉辦;Rust 1.42.0 發佈| 極客頭條

☞騰訊提結合ACNet進行細粒度分類,效果達到最新SOTA | CVPR 2020

☞我最喜歡的雲 IDE 推薦!

☞智能合約編寫之Solidity的高級特性

☞返鄂復工人員自述:回武漢上班,要先飛合肥,再由公司包車接回去


分享到:


相關文章: