【发布时间】: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