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