作者s25g5d4 (function(){})()
看板Ajax
标题Re: [问题] Node.JS 直播技术询问
时间Fri Mar 10 21:41:23 2017
之前稍微研究过一下
不过是两年前的事情了,可能没有 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://webptt.com/cn.aspx?n=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
以上
--
1F:推 dkchronos :招唤obov 04/16 19:23
2F:推 cesar0909 :楼下obov04/16 19:42
3F:推 SNGoMMX :楼下obov 04/16 21:50
4F:→ y3k :上面好多obov 楼下继续当obov 04/16 21:53
5F:推 obov :恩 没问题 继续当obov04/16 22:20
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.117.198.141
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1489153298.A.47E.html
6F:推 MangoTW: 头推 03/10 22:14
7F:推 herbacin: 推推 03/10 22:48
8F:推 ian90911: 推 很详细 03/11 01:32
※ 编辑: s25g5d4 (140.117.198.141), 03/11/2017 02:20:47
9F:推 shaopin: 很赞呐, 我本身做CDN的都还没懂这麽全面 给个推 03/12 12:39
10F:推 akccakcctw: 推 03/16 01:22
11F:推 phantasma: 写的真详细,谢谢! 03/20 19:57
12F:推 kahiro: 不推不行... 03/31 22:59
13F:推 andy199113: 好文推 06/09 23:22
14F:推 TFnight: 好详细,不推不行,好多都还看不太懂 06/06 14:39