Re: [問題] Node.JS 直播技術詢問
之前稍微研究過一下
不過是兩年前的事情了,可能沒有 update 到新資訊
首先目前好取得且 Open Source 的串流伺服器為
nginx-rtmp-module: https://github.com/arut/nginx-rtmp-module
SRS: https://github.com/ossrs/srs
收費的串流伺服器有 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
幸好 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
hls.js 是瀏覽器端的腳本,不需佔用伺服器資源
而 DASH 其實也不是瀏覽器原生支援,必須載入 dash.js 或 Shaka Player
https://github.com/Dash-Industry-Forum/dash.js
https://github.com/google/shaka-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/
縮: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
我只是一個只看不寫扣的廢物 QQ
※ 引述《herbacin (herbacin)》之銘言:
: 最近在研究 Node.JS 直播技術的開發,
: 不過發現大部分的library都沒有支援,
: 主要朝 RTMP 與 HTTP-FLV方向研究, 各有優缺點,
: 但幾乎沒有找到相關的套件與文件在 Node.JS的部分
: 不知道各位大大有沒有碰過這方面的技術可以分享一下,
: 目前知道蠻多直播公司都採用 GoLang 來做直播串流技術的Server開發,
: 但Node好像很少, 煩請各位有相關的文獻也可以分享 謝謝
--
本文與 Node.js 及 JavaScript 的關聯:
透過 HTTP API 控制 streaming server 才是正確的選擇
但要做好 permission control, 不要讓外人存取你的 API
以上
--
推
04/16 19:23,
04/16 19:23
推
04/16 19:42,
04/16 19:42
推
04/16 21:50,
04/16 21:50
→
04/16 21:53,
04/16 21:53
推
04/16 22:20,
04/16 22:20
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.198.141
※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1489153298.A.47E.html
推
03/10 22:14, , 1F
03/10 22:14, 1F
推
03/10 22:48, , 2F
03/10 22:48, 2F
推
03/11 01:32, , 3F
03/11 01:32, 3F
※ 編輯: s25g5d4 (140.117.198.141), 03/11/2017 02:20:47
推
03/12 12:39, , 4F
03/12 12:39, 4F
推
03/16 01:22, , 5F
03/16 01:22, 5F
推
03/20 19:57, , 6F
03/20 19:57, 6F
推
03/31 22:59, , 7F
03/31 22:59, 7F
推
06/09 23:22, , 8F
06/09 23:22, 8F
推
06/06 14:39, , 9F
06/06 14:39, 9F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章