使用 node.js 服务器从 GCP 提供 HLS 播放列表的合适方法
Posted
技术标签:
【中文标题】使用 node.js 服务器从 GCP 提供 HLS 播放列表的合适方法【英文标题】:Suitable approach for serving HLS playlist from GCP using node.js server 【发布时间】:2021-12-29 16:43:54 【问题描述】:我在向用户提供动态 hls 播放列表时遇到了两难境地,因为所有 hls 文件都必须从 GCP 存储中提供。由于索引文件是静态的,我可以简单地使用 here 的一个答案中概述的 express static 来提供它,但它仅限于文件目录(在我看来)。对于来自 GCP 的流式 HLS 播放列表,我尝试了以下方法
用于从 GCP 提供动态索引文件
router.get('/segments-list', (req, res) =>
const playlistName = req.query;
const remoteFile = hlsPlaylistBucket.file('$playlistName.m3u8');
remoteFile.download().then((data) =>
const contents = data[0];
res.send(contents);
);
);
用于向用户提供单个分段文件 (.ts)
router.get('/segments/:segment', (req, res) =>
const segment = req.params;
//* Gets specific segment files from GCP cloud in request of particular segments
const remoteFile = hlsPlaylistBucket.file(`$segment`);
remoteFile.download().then((data) =>
const contents = data[0];
res.send(contents);
);
);
这是清单文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:8.341667,
segments/file000.ts
#EXTINF:8.341667,
segments/file001.ts
#EXTINF:8.341667,
segments/file002.ts
#EXTINF:8.341667,
segments/file003.ts
#EXTINF:5.572233,
segments/file004.ts
#EXT-X-ENDLIST
现在这种方法似乎可行,但这是一种有缺陷的方法,因为每次用户请求时都会为内存中的文件下载小块。并且为每个片段文件提供签名 URL 也不是一种合适的方式,因为一个视频可能包含 200 个片段文件。我的方法是正确的还是我必须在 GCP 中提供像 this 这样的 HLS 播放列表。真正的问题出现在提供基本 url 段文件中,过去几天我一直在这个问题上陷入困境,但我找不到通过提供 HLS 播放列表向用户提供 VOD 文件的合适方法 任何帮助将不胜感激
【问题讨论】:
【参考方案1】:我认为这里最好的选择是使用 CORS(跨源资源共享)从 GCP 存储桶为它们提供服务,在这里您可以找到有关如何为 GCP 存储桶配置 CORS 的指南1。
更进一步,您可以将原始视频文件的转换和打包渲染到 Transcoder API Google 服务2,该服务可以生成 HLS 清单和文件并将其存储到 GCP 存储桶中,以供任何视频使用流媒体播放器,请查看此快速入门指南3。
【讨论】:
感谢您的建议,尽管 atm 由于时间限制我无法合并更改,因此我调整了从下载到流式传输每个文件段的方法,尽管它可以在 atm 但将来我应遵循您的建议,采用更简化的方法 我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。以上是关于使用 node.js 服务器从 GCP 提供 HLS 播放列表的合适方法的主要内容,如果未能解决你的问题,请参考以下文章
通过 XAMPP 从同一 Apache 服务器提供 PHP 和 Node.JS
如何从 node.js 服务器提供 word、excel、ppt 和 pdf 文件
Node.js 与 CouchDB 和 Backbone.js 一起使用,如何提供 json?