HLS协议:获取直播期间的绝对经过时间

Luc*_*bue 5 elapsedtime http-live-streaming hls.js

我有一个非常基本的问题,如果我在谷歌上搜索错误,或者答案是否太简单以至于我没有看到,我不知道。

我正在使用hls.js作为 Javascript 库实现一个 Web 应用程序,我需要一种方法来获取直播流的绝对经过时间,例如,如果用户在 10 分钟后加入直播,我需要一种方法来检测用户的第一个直播时间第二个是流媒体的第 601 秒。

检查流片段,我发现了一些信息,例如 startPTS 和 endPTS,但所有这些信息始终与检索到的块而不是整个流块相关,例如,如果用户在 10 分钟后加入直播并且块持续时间为 2 秒,则第一个我将得到的块将具有 startPTS = 0 和 endPTS = 2,我将得到的第二个块将具有 startPTS = 2 和 endPTS = 4 等等(将值四舍五入到最接近的整数)。

有没有办法从 HLS 直播中提取我需要的绝对经过时间?

Cyr*_*ril 1

我在 iOS (AVPlayer) 上有完全相同的需求,并提供了以下解决方案:

  1. 阅读 m3u8 清单,对我来说它看起来像这样:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:410
#EXT-X-TARGETDURATION:8
#EXTINF:8.333,
410.ts
#EXTINF:8.333,
411.ts
#EXTINF:8.334,
412.ts
#EXTINF:8.333,
413.ts
#EXTINF:8.333,
414.ts
#EXTINF:8.334,
415.ts
Run Code Online (Sandbox Code Playgroud)
  1. 观察到 409 第一个段不是清单的一部分
  2. 乘以EXT-X-MEDIA-SEQUENCEEXT-X-TARGETDURATION您就可以得到第一个可用段的时钟时间的近似值。

我们还要注意,每个段的长度并不正好是 8 秒,因此当我使用目标持续时间时,实际上每个段累积了大约 333 毫秒的误差:

410 * 8 = 3280 seconds = 54.6666 minutes
Run Code Online (Sandbox Code Playgroud)

在这种情况下,对我来说,段始终是 8.333 或 8.334,因此通过 EXTINF 代替,我得到:

410 * 8.333 = 3416.53 seconds = 56.9421 minutes
Run Code Online (Sandbox Code Playgroud)

这近 56.9421 分钟仍然是一个近似值(因为我们不确切知道新0.001错误累积了多少时间),但它更接近真实的时钟时间。