Re: [問題] Node.JS 直播技術詢問

看板Ajax作者 (function(){})()時間7年前 (2017/03/10 21:41), 7年前編輯推噓9(900)
留言9則, 9人參與, 最新討論串2/2 (看更多)
之前稍微研究過一下 不過是兩年前的事情了,可能沒有 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,
招喚obov
04/16 19:23

04/16 19:42,
樓下obov
04/16 19:42

04/16 21:50,
樓下obov
04/16 21:50

04/16 21:53,
上面好多obov 樓下繼續當obov
04/16 21:53

04/16 22:20,
恩 沒問題 繼續當obov
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
很讚吶, 我本身做CDN的都還沒懂這麼全面 給個推
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
文章代碼(AID): #1OmgqIH- (Ajax)
文章代碼(AID): #1OmgqIH- (Ajax)