如何使用带有字符串而不是 m3u8 播放列表的 loadSource()?

Posted

技术标签:

【中文标题】如何使用带有字符串而不是 m3u8 播放列表的 loadSource()?【英文标题】:How to use loadSource() with strings instead of m3u8 playlists? 【发布时间】:2017-12-13 10:57:39 【问题描述】:

在 galeksandrp 的演示中: https://github.com/galeksandrp/hls.js/tree/hlstorrent 他使用 webtorrent 和 hls.js 创建 P2P 流。 该演示非常适合我,但我需要使用字符串变量,而不是使用 hls.loadSource('193039199_mp4_h264_aac_ld_7.m3u8') 加载外部播放列表。

有没有人做过类似的事情?只需尝试加载字符串即可: “尝试解析基本 URL 时出错”,这是可以理解的,因为 URLToolkit 尝试从 loadSource 括号内的任何内容构建绝对 URL,因此它没有可以解析的 URL。

strings变量与'193039199_mp4_h264_aac_ld_7.m3u8'内容相同

strings = ['#EXTM3U',
         '#EXT-X-VERSION:3',
         '#EXT-X-PLAYLIST-TYPE:VOD',
         '#EXT-X-TARGETDURATION:10',
         '#EXTINF:10.000,',
         'magnet:?xt=urn:btih:5493683624141c381fa19c9ed3bf00be2e0d96af',
         '#EXTINF:10.000,',
         'magnet:?xt=urn:btih:1ec3227aabe562cf2b244a41b93fa0a1aa423f4d',
         '#EXTINF:10.000,',
         'magnet:?xt=urn:btih:3cbd1622487f202f11aea838b0984a1478054456',
         '#EXTINF:10.000,',
         'magnet:?xt=urn:btih:9cf20cfe4fd1745ea4f72067192681b30b52a8c5',
         '#EXTINF:10.000,',
         'magnet:?xt=urn:btih:0c96911da7c860a9ae2a26ed8a96c10590508407',
         '#EXT-X-ENDLIST'];

【问题讨论】:

【参考方案1】:
var enc = new TextEncoder("utf-8");
hls.loadSource(URL.createObjectURL(new Blob([enc.encode(strings.join('\n'))])));

说明:只需将播放列表文字转为网址即可,无需写custom playlist loader。

将字符串数组加入文本(如果需要),并使用enc.encode() 将文本转换为Uint8Array。 然后将结果转换为Blobnew Blob([])。 然后将结果转换为blob: 虚拟URL 和URL.createObjectURL()

例子:

https://rawgit.com/galeksandrp/hls.js/hlstorrent-blob-url/client.js https://rawgit.com/galeksandrp/hls.js/hlstorrent-blob-url/server.js
var hls = new Hls(fLoader: customLoader, pLoader: customLoaderP);

说明:你也可以写custom playlist loader,因为默认是硬编码为使用XHR,因此:

不支持文本播放列表 不支持播放列表作为 ArrayBuffer 及其衍生产品(Blob、FileReader)。 只支持普通和blob:网址

该自定义播放列表加载器的示例是 customLoaderP 函数,您可以在其中发现字符串数组形式的播放列表。

还请注意,我的示例针对实时 P2P 进行了优化,因此为 每个 10 秒的块创建了新的 torrent,如果您分发 VOD/DVR,则可能不需要。对于通常的视频,您可以在单个种子中传递所有块。

【讨论】:

非常感谢。这正是我所需要的。下一步是让它与直播视频一起使用。

以上是关于如何使用带有字符串而不是 m3u8 播放列表的 loadSource()?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取直播 m3u8 文件而不是 YouTube 直播流的 DVR m3u8 文件?

如何在手机和桌面上播放html5视频播放m3U8?

m3u8网页视频怎么打开

m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?

Winamp - HLS 收音机 (m3u8)

各位大神,苹果cms的m3u8播放器怎么新增,能给一份详细教程吗?