如何将 loadSource() 与字符串而不是 m3u8 播放列表一起使用?
How to use loadSource() with strings instead of m3u8 playlists?
在 galeksandrp 的演示中:
https://github.com/galeksandrp/hls.js/tree/hlstorrent 他使用 webtorrent 和 hls.js 创建 P2P 流。
该演示非常适合我,但我需要使用字符串变量而不是使用 hls.loadSource('193039199_mp4_h264_aac_ld_7.m3u8').
加载外部播放列表
有没有人做过类似的事情?简单地尝试加载字符串会给出:
"Error trying to parse base URL" 这是可以理解的,因为 URLToolkit 试图从 loadSource 括号内的任何内容构建绝对 URL,因此它不会有可以解析的 URL。
字符串变量与'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'];
var enc = new TextEncoder("utf-8");
hls.loadSource(URL.createObjectURL(new Blob([enc.encode(strings.join('\n'))])));
说明:只需要将播放列表文字转为URL即可,无需写custom playlist loader.
- 将字符串数组连接到文本(如果需要),并将文本转换为
Uint8Array
with enc.encode()
。
- 然后用
new Blob([])
. 将结果变成 Blob
- 然后将结果转为
blob:
虚拟 URL with 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 则可能不需要.对于普通视频,您可以在单个 torrent 中传递所有块。
在 galeksandrp 的演示中: https://github.com/galeksandrp/hls.js/tree/hlstorrent 他使用 webtorrent 和 hls.js 创建 P2P 流。 该演示非常适合我,但我需要使用字符串变量而不是使用 hls.loadSource('193039199_mp4_h264_aac_ld_7.m3u8').
加载外部播放列表有没有人做过类似的事情?简单地尝试加载字符串会给出: "Error trying to parse base URL" 这是可以理解的,因为 URLToolkit 试图从 loadSource 括号内的任何内容构建绝对 URL,因此它不会有可以解析的 URL。
字符串变量与'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'];
var enc = new TextEncoder("utf-8");
hls.loadSource(URL.createObjectURL(new Blob([enc.encode(strings.join('\n'))])));
说明:只需要将播放列表文字转为URL即可,无需写custom playlist loader.
- 将字符串数组连接到文本(如果需要),并将文本转换为
Uint8Array
withenc.encode()
。 - 然后用
new Blob([])
. 将结果变成 - 然后将结果转为
blob:
虚拟 URL withURL.createObjectURL()
.
Blob
示例:
- 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 则可能不需要.对于普通视频,您可以在单个 torrent 中传递所有块。