顯示廣告
隱藏 ✕
※ 本文為 terievv 轉寄自 ptt.cc 更新時間: 2017-04-15 02:59:16
看板 Ajax
作者 s25g5d4 (function(){})()
標題 Re: [問題] Node.JS 直播技術詢問
時間 Fri Mar 10 21:41:23 2017


之前稍微研究過一下

不過是兩年前的事情了,可能沒有 update 到新資訊

首先目前好取得且 Open Source 的串流伺服器為

nginx-rtmp-module: https://github.com/arut/nginx-rtmp-module
GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server
[圖]
nginx-rtmp-module - NGINX-based Media Streaming Server ...

 

SRS: https://github.com/ossrs/srs
GitHub - ossrs/srs: SRS is an industrial-strength live cluster, with simple code and best conceptual integrity.
[圖]
srs - SRS is an industrial-strength live cluster, with simple code and best conceptual integrity. ...

 

收費的串流伺服器有 WOWZA Stream Engine 與 Adobe Media Server

我只有用過 nginx-rtmp-module

SRS 只有看過 doc 沒有架過

--

先提 nginx-rtmp, 顧名思義他是 nginx 的一個模組

但它通常不包含於各 distro repository 的 nginx 套件中

至少我用的 Ubuntu 12.04/16.04 都沒有,必須把原始碼抓下來自己編

執行系統更新的時候要注意把 nginx 從更新名單中移除

我有好幾次 apt-get upgrade 弄壞 nginx



再來它最重要的功能是 HTTP Hooks

當使用者串流打上來,或是觀眾觀看串流時,若有設定 hook

會送一個 POST request 到你指定的 URL

而且可以根據 HTTP status code 決定行為

HTTP 2xx 代表接受, HTTP 3xx 代表轉移(下述), HTTP 4xx 代表拒絕

使用 HTTP Hooks 可以做到

1. 統計資料

2. 驗證 (是否為合法使用者)

3. 隱藏上傳者的 RTMP URL (或說 token)

4. 防盜連

當然還有很多應用,但我當初研究只是想複製一個 twitch 而已 XDD



有用過 twitch 等串流服務的人應該都知道

辦帳號後會拿到一組 RTMP URL 與 token

這組 token 必須要保證只有上傳者知道

不然流出去的話,誰都可以打串流到該頻道

當然也有 one time token 或設定 expire 等方式防盜用

不過 twitch 的 token 是固定的

當觀眾播放的時候,給的網址必須是另一組 rtmp URL

例如上傳者的帳號是 test123, token 是 A1B2C3D4

那上傳者打串流用的 URL 會是 rtmp://example.com/publish/A1B2C3D4

觀眾觀看串流的 URL 是 rtmp://example.com/play/test123



那如何讓 play/test123 這個 URL 播放 publish/A1B2C3D4 呢?

就是透過 HTTP hook 送 HTTP 3xx 並給新的 Location: publish/A1B2C3D4

這對觀眾來說是透明的,他們看到的播放 URL 仍然是 play/test123

只是伺服器那邊從 publish/A1B2C3D4 拉流過來播而已

當然 RTMP 是 flash player 時代的做法

現在 HTML5 的話改用 HLS 或 MPEG DASH 就是另外一回事了



而防盜連則是把給觀眾的 URL 加上 token

例如 play/test123?ip=x.x.x.x&token=XXOOXXOO&time=1970-01-01T00:00:00.001Z

播放時伺服器透過 hook 去檢查 token 是否合法

--

再來提到 SRS, 這是大陸網友仿 nginx-rtmp 但重新研發的程式

官網上說定位是營運級的網際網路直播伺服器叢集

相較 nginx-rtmp, SRS 號稱效能更佳

並且可以很簡單的橫向擴充更多伺服器集群

而且最重要的是它有完整的中文文件,對中文使用者友善

但它的 HTTP Hooks 就沒有 nginx 那麼完整

參考: https://github.com/ossrs/srs/issues/406
HTTP API kick/redirect client ·  Issue #406 ·  ossrs/srs ·  GitHub
[圖]
srs - SRS is an industrial-strength live cluster, with simple code and best conceptual integrity. ...

 

幸好 SRS 除了作 origin server 外,也可以當 edge server

所以如果對 hooks 有進階需求的人可以考慮

用 nginx-rtmp 作 origin, SRS 當 edge server

或是像 Soft_Job 板 #1OjQmi51 作者 xxoo1122 寫的文章一樣

用 Wowza 當 origin, SRS 做 edge server (因為 Wowza 授權要錢)

--

再來談到 web browser 支援,當然 RTMP 是不能直接用的

目前要不使用 Flash Player 在瀏覽器播放的話,有兩大選擇:

MPEG Dynamic Adaptive Streaming over HTTP (DASH)

Apple HTTP Live Streaming (HLS)

比較常見的串流網站多是用 HLS

雖然 Chrome 與 Firefox 無法直接播放 HLS, 但有 hls.js 可以解決
https://github.com/dailymotion/hls.js
GitHub - video-dev/hls.js: JavaScript HLS client using Media Source Extension
[圖]
hls.js - JavaScript HLS client using Media Source Extension ...

 

hls.js 是瀏覽器端的腳本,不需佔用伺服器資源

而 DASH 其實也不是瀏覽器原生支援,必須載入 dash.js 或 Shaka Player
https://github.com/Dash-Industry-Forum/dash.js
GitHub - Dash-Industry-Forum/dash.js: A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.
[圖]
dash.js - A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers. ...

 
https://github.com/google/shaka-player
GitHub - google/shaka-player: JavaScript player library / DASH client / MSE-EME player
[圖]
shaka-player - JavaScript player library / DASH client / MSE-EME player ...

 

twitch 與 livehouse.in 都採用 HLS,原因我不是很清楚 XD

那有直播網站使用 DASH 嗎?

有的,而且還很大間──就是 YouTube



DASH 與 HLS 都是先把串流切成一小段檔案 (幾秒)

並可能切成 480p, 720p, 1080p 等等多種解析度存放

所以可以依據使用者裝置規格及網路狀態,選擇適合的解析度

由於必須先把串流存成檔案,所以延遲絕對比 RTMP 高

SRS 官方說 HLS 延遲高達 10 秒以上 (DASH 應該也差不多)

但好處是可以把切出來的檔案丟給 HTTP server 去處理

不用勞煩 RTMP server 同時接收及播放串流



DASH 與 HLS 最大的差異在於使用的編碼不同

HLS 只能接受 H.264 與 AAC/MP3

所以必須注意授權問題 (感恩 MPEG 讚嘆 MPEG)

DASH 雖然是 MPEG 設計的,但反而沒有限制使用編碼

例如 YouTube 會打 WebM (VP9) 串流給使用者

而 WebM (包含 VP8, VP9, Vorbis, Opus) 都是不需授權費的

BUT !!! 使用 DASH 技術卻要付授權費,畢竟是 MPEG 嘛...

所以嚴格來說,能播放 DASH 的瀏覽器,開發商就要付錢給 MPEG

這樣 Mozilla 會不開心,Google 也不能接受

所以其實瀏覽器實現的不是 DASH,而是 MSE

問題來了,有 MSE 就能播放 DASH 了嗎?

當然不是,這樣 MPEG 還是會來收錢啊

所以是透過 JavaScript 實現從 MSE 讀取 DASH (或 HLS) 檔案並播放



不管 DASH 或 HLS, 都只是告訴瀏覽器去哪裡抓檔案回來播而已

真正解碼還是需要靠 decoder 處理

可是把 H.264 decoder 整合進瀏覽器內必須付錢給 MPEG

所以 Mozilla 非常不開心,早期曾努力推廣過 WebM (VP8, VP9)

但是 Microsoft 說要用 H.264, Apple 說要用 H.264

就連 Google 號稱要移除 H.264 支援,卻直到現在仍然沒有移除
https://blog.chromium.org/2011/01/html-video-codec-support-in-chrome.html

所以 H.264 成為了事實標準

Mozilla 的妥協是它不內建支援 H.264

但可透過作業系統呼叫系統裡的 H.264 decoder 來解

後來 Cisco 跳出來說,要做一款大家都可免費使用的 H.264 decoder

也就是 OpenH264,Mozilla 當然就樂於將它包進 Firefox 專案裡了

但是 OpenH264 只能解 base profile, 廢到不行

所以最後還是要靠 OS 提供 decoder



那麼是否有 royalty-free 的選擇呢?

有的,就是本篇提到很多次的 WebM

這是 Google 推出的開放格式影音容器標準

支援的編碼有 VP8, VP9, Vorbis 及 Opus,均為開放標準

而且瀏覽器支援度不差

Google Chrome, Mozilla Firefox 甚至 Microsoft Edge 都有支援

https://blogs.windows.com/msedgedev/2016/04/18/webm-vp9-and-opus-support-in-microsoft-edge/
WebM, VP9 and Opus Support in Microsoft Edge - Microsoft Edge Dev BlogMicrosoft Edge Dev Blog
[圖]
[圖]
[圖]
Starting with EdgeHTML 14.14291, the open-source WebM container format and the VP9 video and Opus audio codecs are supported in Microsoft Edge. These  ...

 
縮:goo.gl/Rhzs8C

唯要使用 WebM 做串流就必須使用 DASH

所以還是要被 MPEG 敲詐



伺服器方面 nginx-rtmp 支援 DASH 與 HLS, SRS 僅支援 HLS

兩者皆不包含編碼器,故要支援此兩者必須加上 FFmpeg 支援

但 SRS 可以把 FFmpeg 靜態連結編譯進執行檔本身

同時 SRS 內建整合 HTTP server, 當然也可以給 Nginx 或 Apache 處理

至於 nginx-rtmp 當然是依存於 Nginx 下囉



最後,再次推薦一定要閱讀 Soft_Job 板優良文章 #1OjQmi51 (Soft_Job)
https://www.ptt.cc/bbs/Soft_Job/M.1488301100.A.141.html
[心得] 自建串流Edge CDN Server - 看板 Soft_Job - 批踢踢實業坊
大家好,這一年網紅直播非常熱門,商機也非常大帶動了CDN及ISP不少的流量成長, 今天要來介紹一下要怎樣自建RTMP HLS等串流Edge CDN,有人會問現成的串流CDN 解決方案不是很多嗎?Akamai,網宿科技,Wowza CDN等,俗話說的好「賠錢的生意沒人做」 ,CDN業者的產品也是有分等級的,因為台灣的網路比較畸形,國內頻寬比國外頻寬貴很多, 所以購買等級低的方案一般就會被分配到美國的節點,好一點到香港,但是中華電信到
 

我只是一個只看不寫扣的廢物 QQ

※ 引述《herbacin (herbacin)》之銘言:
: 最近在研究 Node.JS 直播技術的開發,
: 不過發現大部分的library都沒有支援,
: 主要朝 RTMP 與 HTTP-FLV方向研究, 各有優缺點,
: 但幾乎沒有找到相關的套件與文件在 Node.JS的部分
: 不知道各位大大有沒有碰過這方面的技術可以分享一下,
: 目前知道蠻多直播公司都採用 GoLang 來做直播串流技術的Server開發,
: 但Node好像很少, 煩請各位有相關的文獻也可以分享 謝謝

--

本文與 Node.js 及 JavaScript 的關聯:

透過 HTTP API 控制 streaming server 才是正確的選擇

但要做好 permission control, 不要讓外人存取你的 API

以上

--
dkchronos   :招喚obov04/16 19:23
cesar0909   :樓下obov04/16 19:42
SNGoMMX     :樓下obov04/16 21:50
y3k         :上面好多obov 樓下繼續當obov04/16 21:53
obov        :恩  沒問題  繼續當obov04/16 22:20

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.198.141
※ 文章代碼(AID): #1OmgqIH- (Ajax)
※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1489153298.A.47E.html
MangoTW: 頭推1F 03/10 22:14
herbacin: 推推2F 03/10 22:48
ian90911: 推 很詳細3F 03/11 01:32
※ 編輯: s25g5d4 (140.117.198.141), 03/11/2017 02:20:47
shaopin: 很讚吶, 我本身做CDN的都還沒懂這麼全面 給個推4F 03/12 12:39
akccakcctw: 推5F 03/16 01:22
phantasma: 寫的真詳細,謝謝!6F 03/20 19:57
kahiro: 不推不行...7F 03/31 22:59

--
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 684 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇