HLS 'EVENT' 播放列表无法在播放器中启动
HLS 'EVENT' playlists failing to start in players
我的 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
然后尝试 open http://localhost:3001/playlist.m3u8
在 Safari 或任何你想要的播放器中。它应该可以正常播放,因为它是一个完整的播放列表。**
但是,如果您添加一个查询参数 ?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=
#EXT-X-DISCONTINUITY
标签用于表示文件格式、编码参数、轨道数等方面的变化。如果播放列表中的片段在这些方面是相同的,您可以从播放列表中删除 #EXT-X-DISCONTINUITY
标签 - 您不需要它们。
某些客户端可能与协议版本 6 不兼容。您似乎没有使用任何版本 6 的特定功能,因此请尝试将版本号设置为 3 以查看是否有帮助。
事情是这样的:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
如果你return上面的文件,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
如果你return以上,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
如果你 return 以上,safari 将开始播放,因为可用媒体 9.999367+9.968911 比 EXT-X-TARGETDURATION 好,你会在 9.999367+9.968911+11/2 附近看到另一个请求,一切都与时间有关!
我的 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
然后尝试 open http://localhost:3001/playlist.m3u8
在 Safari 或任何你想要的播放器中。它应该可以正常播放,因为它是一个完整的播放列表。**
但是,如果您添加一个查询参数 ?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=
#EXT-X-DISCONTINUITY
标签用于表示文件格式、编码参数、轨道数等方面的变化。如果播放列表中的片段在这些方面是相同的,您可以从播放列表中删除 #EXT-X-DISCONTINUITY
标签 - 您不需要它们。
某些客户端可能与协议版本 6 不兼容。您似乎没有使用任何版本 6 的特定功能,因此请尝试将版本号设置为 3 以查看是否有帮助。
事情是这样的:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:11
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
如果你return上面的文件,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
如果你return以上,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
如果你 return 以上,safari 将开始播放,因为可用媒体 9.999367+9.968911 比 EXT-X-TARGETDURATION 好,你会在 9.999367+9.968911+11/2 附近看到另一个请求,一切都与时间有关!