【问题标题】:HLS 'EVENT' playlists failing to start in playersHLS 'EVENT' 播放列表无法在播放器中启动
【发布时间】:2016-07-10 05:00:33
【问题描述】:

我的 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

我们发现所有客户的行为都很奇怪。如果您在上传第一个块(或者甚至在 3 个块之后)时在 iOS 和 Safari 中打开 m3u8 播放列表,播放器将开始播放视频。但是,有时它会停止,并且无法恢复。很多时候,它甚至都不会开始播放。

完整的播放列表(即带有#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 或任何你想要的播放器中尝试 open http://localhost:3001/playlist.m3u8。它应该可以正常播放,因为它是一个完整的播放列表。**

但是,如果您添加查询参数?start=<some unix timestamp>,它将模拟从该时间戳开始每 6 秒添加 1 个块,直到所有块完成,此时它将附加一个 #EXT-X-ENDLIST 行。

示例网址:http://localhost:3001/playlist.m3u8?start=1460092250872

编辑 5:我现在已经在 Heroku 上完成了:http://guarded-mesa-71212.herokuapp.com/playlist.m3u8?start=

【问题讨论】:

  • 您能告诉我们您是如何写入 m3u8 文件的吗?
  • 我们所做的只是在上传文件时,将块附加到播放列表中。播放列表是根据请求生成的(即每次都从块数据库中生成,而不是保存到文件中并更新)。这有意义吗?
  • 那么您可能需要使用wireshark来调试响应传输的实际http数据包,因为文件格式是正确的。
  • @aergistal 非常感谢您的测试。唔。是的,我一直怀疑它也在视频中,因为我提供的 Apple 块似乎播放得很好。我会做一些挖掘工作
  • @DominicBou-Samra 你是如何编码/分割的?此外,如果您使用其他一些网络服务器并且 URL 没有更改,请确保它不是缓存问题。禁用 m3u8 的缓存。

标签: ios video-streaming http-live-streaming


【解决方案1】:

这是发生了什么:

#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 是的!我通过捕获实际的 http 数据包来做到这一点。
  • 所以我认为这实际上是问题所在。我们的目标持续时间并不总是正确的。我们现在也等到至少有 2N 个块存在,我们没有任何问题。
【解决方案2】:

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

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

【讨论】:

  • 我们已经尝试了版本 3。没有帮助。我们也尝试过不使用不连续标签。同样,没有变化:(
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 2013-05-13
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多