使用 node.js 服务器从 GCP 提供 HLS 播放列表的合适方法

Suitable approach for serving HLS playlist from GCP using node.js server

我在向用户提供动态 hls 播放列表时遇到了难题,因为所有 hls 文件都必须从 GCP 存储提供。由于索引文件是静态的,我可以简单地使用 express static 为它提供服务,如 here 中的一个答案所述,但它仅限于文件目录(在我看来)。对于来自 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

现在这种方法似乎可行,但这是一种有缺陷的方法,因为每次用户请求时都会为内存中的文件下载小块。并且为每个片段文件提供签名的 urls 也不是一种合适的方式,因为一个视频可能包含 200 个片段文件。我的方法是正确的还是我必须在 GCP 中提供像 this 这样的 HLS 播放列表。真正的问题出现在服务基础 url 段文件中,过去几天我一直被这个问题困扰,但我找不到合适的方式通过服务 HLS 播放列表向用户提供 VOD 文件 任何帮助将不胜感激

我认为这里最好的选择是使用 CORS(跨源资源共享)从 GCP 存储桶为它们提供服务,在这里您可以找到有关如何为 GCP 存储桶配置 CORS 的指南 1

更进一步,您可以将原始视频文件的转换和打包渲染到 Transcoder API Google 服务 2, which can generate and store the HLS manifest and files into a GCP bucket, to later be used by any Video Streaming Player, take a look at this Quickstart guide 3.