我在向用户提供动态 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 文件任何帮助将不胜感激