如何检查 HLS 提要是否仍然有效

How to check HLS feed is still live or not

我有一个 m3u8 供稿,我正在寻找一种方法来检测它是否仍在使用 Javascript。 当我获取 url 时,我仍然会得到所有块的列表,但直播早就停止了。并且播放器没有播放它。 所以我想知道是否有一种方法可以检查 m3u8 提要是否仍然有效,而无需在播放器上尝试。

常见的直播行为是每 x 秒提供一个新片段,即添加到播放列表的末尾。

所以您可以做的是加载一次播放列表,然后等待 x 秒并再次加载。如果直播仍然 运行 播放列表中的最后一段应该已经改变(即向上移动)。

关于等待时间: 最初加载播放列表时,您会在播放列表中看到一个 EXT-X-TARGETDURATION 标记,用于指定最大片段持续时间。因此,如果我们在重新加载之前等待至少一个目标持续时间,则必须至少添加一个新片段。

示例:

  1. 初始负载:

     #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
    
  2. 等待 8 秒,因此 #EXT-X-TARGETDURATION:8

  3. 第二次加载:

     #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
    

旁注

以上示例是一个滑动 window 直播流,即播放列表顶部的片段会消失,EXT-X-MEDIA-SEQUENCE 会递增。在这种情况下,检查 EXT-X-MEDIA-SEQUENCE 是否发生变化是一种选择。但是,如果播放列表指定了 EXT-X-PLAYLIST-TYPEEVENT,那么顶部的任何片段都不会丢失 [1] EXT-X-MEDIA-SEQUENCE 不会改变。然而,检查最后一段的方法在任何情况下都有效。

[1] https://www.rfc-editor.org/rfc/rfc8216#section-4.3.3.5

编辑

HLS 规范进一步指出:

If a Media Playlist does not contain the EXT-X-ENDLIST tag, the server MUST make a new version of the Playlist file available that contains at least one new Media Segment. It MUST be made available relative to the time that the previous version of the Playlist file was made available: no earlier than one-half the target duration after that time, and no later than 1.5 times the target duration after that time. This allows clients to utilize the network efficiently.

所以实际上我们必须等待至少 1.5 倍的目标持续时间才能重新加载。