0

我在向用户提供动态 hls 播放列表时遇到了两难境地,因为所有 hls 文件都必须从 GCP 存储中提供。由于索引文件是静态的,我可以简单地使用这里的一个答案中概述的 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中提供这样的 HLS 播放列表。真正的问题出现在提供基本 url 段文件中,过去几天我一直被困在这个问题上,但我找不到合适的方式通过提供 HLS 播放列表向用户提供 VOD 文件任何帮助将不胜感激

4

1 回答 1

1

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

更进一步,您可以将原始视频文件的转换和打包渲染到 Transcoder API Google 服务2,该服务可以生成 HLS 清单和文件并将其存储到 GCP 存储桶中,以供任何视频流播放器使用,采取看看这个快速入门指南3

于 2021-12-30T22:36:10.960 回答