HLS“EVENT”播放列表在播放器中无法启动

22

我有类似这样的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=

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dipen Panchasara
嗨 Dipen。感谢你的询问。是的,我们已经使用那个工具进行了验证。当块被附加时(但播放列表尚未完全完成),以及当所有块都在那里并且我们有一个 endlist 标记时,我们的播放列表都是有效的。 - Dominic Bou-Samra
@aergistal 我们已经使用本地文件运行了这个程序。我正在使用苹果文件,所以大家有东西可以操作。你觉得我应该打包一个示例工程吗? - Dominic Bou-Samra
1
@aergistal 非常感谢您的测试。嗯,我一直怀疑问题也出现在视频中,因为我提供的苹果块似乎播放得很好。我会进行一些挖掘。 - Dominic Bou-Samra
1
@DominicBou-Samra 你是如何进行编码/分段的?另外,如果你正在使用其他的Web服务器并且URL没有改变,请确保这不是缓存问题。禁用m3u8的缓存。 - aergistal
显示剩余10条评论
2个回答

11

这是发生的事情:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0

如果您返回上述文件,Safari将完全不会请求下一个文件,播放就会停止。

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.999367,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/9fc1a264af66e8acb04953bc6634fb6e.ts

如果您返回上述内容,Safari将在大约11/2秒左右请求下一个文件,此时不会开始播放。

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.999367,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/9fc1a264af66e8acb04953bc6634fb6e.ts
#EXTINF:9.968911,
https://cammy-bucket-staging-sydney.s3.amazonaws.com/3e52720b320379de8afc940c3d1b7d34.ts

如果您返回以上内容,Safari将开始播放,因为可用媒体9.999367+9.968911大于EXT-X-TARGETDURATION,并且您将在约9.999367+9.968911+11 / 2左右看到另一个请求,一切都关乎时间!


出于好奇,你是否实际检查了请求时间?因为标准规定第一次或者播放列表更改时应等待 TARGETDURATION,如果自上次更改以来未更改,则应等待 TARGETDURATION / 2 - aergistal
1
@aergistal 是的!我是通过捕获实际的HTTP数据包来完成的。 - Allen
1
所以我认为这可能是问题所在。我们的目标持续时间并不总是正确的。现在我们也会等待至少有2N个块,这样就没有任何问题了。 - Dominic Bou-Samra

6
< p > #EXT-X-DISCONTINUITY 标签用于指示文件格式、编码参数、轨道数量等的更改。如果播放列表中的片段在这些方面上是相同的,您可以从播放列表中删除#EXT-X-DISCONTINUITY标签 - 您不需要它们。

一些客户端可能与协议的第6版不兼容。您似乎没有使用任何第6版特定功能,因此尝试将版本号设置为3,看看是否有帮助。


1
我们已经尝试过第三个版本,但没有帮助。我们也尝试过不使用不连续标签,但仍然没有改变 :( - Dominic Bou-Samra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接