【问题标题】:contrib hls js skips parts of the m3u8, howto prevent thiscontrib hls js 跳过部分 m3u8,如何防止这种情况
【发布时间】:2016-12-02 09:00:52
【问题描述】:

我们正在开发一种将两个 m3u8 组合在一起的服务器端解决方案。我们之前一直在使用 FFMPEG 来连接两个流并创建一个新流。这一切都很好。

但是,由于性能问题,我们决定通过分析原始 m3u8 文件并将它们连接在一起来重新设计实现。

这似乎工作正常,我们能够分析原始文件并重建 m3u8。在此之后,我们将“新”m3u8 提供给客户端,一切正常。 我们对第二个 m3u8 文件执行相同的过程,再次,一切正常,我们也可以播放这个文件。

接下来我们尝试将两个文件连接成一个文件。这似乎工作得很好,我们将片段一个接一个地放在另一个上,然后将其提供给玩家。 在 safari 中,这就像一个魅力,因为我们不需要任何额外的插件/javascript/等。

Chrome,使用 video.js 和 video-contrib-hls,开始播放流并且似乎工作。但是,它基本上只是跳过连接的流(以秒为单位)。您可以看到电影的运行时间变短了,而这些片段只是被播放器忽略了。

这个问题有什么办法吗?

下面是一个示例部分或我们连接的 m3u8(我已经更改了 url)。

#EXTM3U
#EXT-X-VERSION:5
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:20
#EXT-X-PROGRAM-DATE-TIME:2016-12-01T18:16:11.743000+00:00
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x00000000000000000000000000000000
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G00000000.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x0000000000000000000000000000000B
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G0000000B.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x0000000000000000000000000000000C
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G0000000C.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x0000000000000000000000000000000D
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G0000000D.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x0000000000000000000000000000000E
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G0000000E.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x0000000000000000000000000000000F
#EXTINF:4.0960,
http://subdomain1.someurl.com/slices/648/456/123/G0000000F.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=123&v=123&r=g",IV=0x00000000000000000000000000000010
#EXTINF:2.64830,
http://subdomain1.someurl.com/slices/648/456/123/G00000010.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000000
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000000.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000001
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000001.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000002
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000002.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000003
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000003.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000004
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000004.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000005
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000005.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000006
#EXTINF:4.0960,
https://subdomain2.someurl.com/slices/4da/456/789/D00000006.ts?x=0&si=0
#EXT-X-KEY:METHOD=AES-128,URI="https://localhost/check2?b=789&v=789&r=d",IV=0x00000000000000000000000000000007
#EXTINF:3.09250,
https://subdomain2.someurl.com/slices/4da/456/789/D00000007.ts?x=0&si=0
#EXT-X-ENDLIST

【问题讨论】:

  • 我在 chrome 中找到了一些调试信息,似乎读取的缓冲区不正确(因为它是第二个文件播放,它从 0 重新开始)00:00:57 466 debug Skipping splice frame generation: first new buffer at 0us begins at or before existing buffer at 0us. 00:00:57 605 info Video codec: avc1.42C00D

标签: javascript google-chrome video.js http-live-streaming m3u8


【解决方案1】:

当您将两个或多个流拼接在一起时,如果时间戳或轨道等发生变化,您需要使用#EXT-X-DISCONTINUITY 标记将它们分开。来自规范:

EXT-X-DISCONTINUITY 标记必须存在,如果有变化 任何以下特征:

o 文件格式

o 曲目的编号、类型和标识符

o 时间戳序列

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2018-10-16
    • 2023-04-03
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2015-08-07
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多