我有一个m3u8
供稿,我正在寻找一种方法来检测它是否仍在使用Javascript
。
当我获取url时,我仍然会得到所有块的列表,但是直播很久以前就停止了。并且播放器没有在播放。
所以我想知道是否有一种方法可以检查m3u8
feed是否仍然有效,而无需在播放器上尝试。
答案 0 :(得分:2)
常见的实时流行为是,每x
秒就会有一个新的分段可用,即在播放列表的末尾添加。
因此,您可以做的是一次加载播放列表,然后等待x
秒,然后再次加载。如果实时流仍在运行,则播放列表中的最后一个片段应该已更改(即向上移动)。
关于等待时间:
最初加载播放列表时,您会在播放列表中看到一个EXT-X-TARGETDURATION
标签,用于指定最大片段时长。因此,如果我们在重新加载之前等待至少一个目标持续时间,则必须至少添加了一个新的分段。
初始负载:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:8.0,
https://priv.example.com/0.ts
#EXTINF:8.0,
https://priv.example.com/1.ts
#EXTINF:8.0,
https://priv.example.com/2.ts
等待8秒,因此#EXT-X-TARGETDURATION:8
第二次加载:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:8.0,
https://priv.example.com/1.ts
#EXTINF:8.0,
https://priv.example.com/2.ts
#EXTINF:8.0,
https://priv.example.com/3.ts
上面的示例是一个滑动窗口实时流,即,播放列表顶部的片段丢失,EXT-X-MEDIA-SEQUENCE
递增。在这种情况下,可以检查是否EXT-X-MEDIA-SEQUENCE
进行了更改。但是,如果播放列表指定了EXT-X-PLAYLIST-TYPE
中的EVENT
,则没有段会退出顶部[1] EXT-X-MEDIA-SEQUENCE
不会改变。但是,在任何情况下,都可以使用检查最后一段的方法。
[1] https://tools.ietf.org/html/rfc8216#section-4.3.3.5
HLS规范进一步指出:
如果媒体播放列表不包含EXT-X-ENDLIST标签,则 服务器必须提供可用的新版本的播放列表文件 包含至少一个新的媒体细分。必须提供 相对于播放列表文件先前版本的时间 可用:不早于目标持续时间的一半 在此之后,且不得超过目标持续时间的1.5倍 在那之后。这使客户可以利用网络
实际上,我们必须至少等待目标时间的1.5倍才能重新加载。