我有类似这样的HLS播放列表:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
它们属于EVENT
类型,这意味着当块可用时会添加块,并且当所有块都存在时,在末尾添加#EXT-X-ENDLIST
标签。
因此,当所有块都上传完毕时,我们最终得到的播放列表如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence4.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence5.ts
#EXT-X-ENDLIST
我们发现所有客户端都出现了奇怪的问题。如果在iOS和Safari中打开m3u8播放列表,并在上传第一块(或甚至在上传3块后)时,播放器将会像应该播放视频一样开始播放。然而有时它会停止播放,并且无法恢复播放。往往情况下,它甚至无法开始播放。完整的播放列表(即带有
#EXT-X-ENDLIST
标签的)可以完美地播放。只是当播放列表部分完成时才会出现此问题。我们尝试了各种播放器:Quicktime、Safari、iOS、VLC、Flowplayer等等。所有这些都有各种问题,但这是最紧迫的问题。
非常感谢任何解决此问题的指导意见。
编辑:我们尝试了HLS.js并且它可以完美播放。用户体验也很好。
编辑2:为了重现此问题,我建议使用某种本地HTTP服务器(我使用
python -m SimpleHTTPServer
提供上面的播放列表)。然后简单地将文件附加到播放列表中,以模拟文件上传并观察播放器崩溃。编辑3:好的,我已经构建了一个简单的测试工具来观察行为。https://github.com/dbousamra/m3u8-example运行
node app.js
,然后尝试在Safari或任何您想要的播放器中打开 http:// localhost:3001 / playlist.m3u8
。它应该正常播放,因为它是一个完整的播放列表。如果您添加查询参数
?start=<some unix timestamp>
,它将模拟从该时间戳开始每6秒添加1个块的事件,直到所有块都完成,然后附加#EXT-X-ENDLIST
行。示例URL:
http://localhost:3001/playlist.m3u8?start=1460092250872
编辑5:现在我已经将其上载到Heroku:http://guarded-mesa-71212.herokuapp.com/playlist.m3u8?start=
m3u8
的缓存。 - aergistal