如何为 HLS 创建字节范围的 m3u8 播放列表?
Posted
技术标签:
【中文标题】如何为 HLS 创建字节范围的 m3u8 播放列表?【英文标题】:How to create byte-range m3u8 playlist for HLS? 【发布时间】:2014-06-23 05:58:16 【问题描述】:Apple gives an example 支持 HLS 的 m3u8 文件中的字节范围段
#EXTM3U
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-VERSION:4
#EXTINF:10.0,
#EXT-X-BYTERANGE:75232@0
media.ts
#EXTINF:10.0,
#EXT-X-BYTERANGE:82112@752321
media.ts
#EXTINF:10.0,
#EXT-X-BYTERANGE:69864
media.ts
但我不知道如何为给定的 .ts 文件创建这样的播放列表。 有什么工具吗?
【问题讨论】:
【参考方案1】:有 -hls_flags
作为 ffmpeg 选项。 (https://www.ffmpeg.org/ffmpeg-formats.html)
以下命令生成单个 ts 文件,该文件在 m3u8 索引文件中按字节范围特征(从 HLS 版本 4 支持)分段。
$ ffmpeg -i sample.mp3 -hls_time 20 -hls_flags single_file out.m3u8
【讨论】:
【参考方案2】:看起来像
ffprobe -show_frames media.ts -print_format json
提供了足够的关于帧的信息来构建这样的播放列表,尽管需要一些脚本来构建它。
如果我使用该方法成功,我将使用脚本更新此答案。
更新:
这是我现在找到的几个有用的链接:
Bash scripts for generating iframe playlists - 需要一点优化,因为它会多次调用 ffprobe
iframe-playlist-generator - python 项目,可用于从普通播放列表生成 iframe 播放列表
这不是我最初搜索的内容,但 I-Frame 播放列表类似于字节范围的播放列表,更适合我的任务,因此我将使用这两个项目作为参考/起点创造一些更适合我的东西。
这些项目实际上使用不同的方法来查找 I-Frame 的大小 - bash 脚本只是使用 ffprobe 在 pkt_size 中显示的内容,而 python 项目通过计算大小作为数据包位置的差异并将 188 添加到匹配来自苹果的示例播放列表。 188 字节是 mpeg-ts 数据包的大小,可能与此有关,但是我还没有设法理解。这种大小计算的差异导致生成不同的播放列表,可能其中一个在某些方面不正确,但实际上 VLC 播放两者都没有任何问题,所以我将坚持使用更简单的方法,直到它被证明是不正确的。
更新 2:
我有created a ruby module,它可以使用ffprobe
提取给定.ts 文件的I-Frame 信息,并根据该信息构建I-Frame 和通常的字节范围m3u8 播放列表(如问题所要求的那样)。
我发现我之前提到的创建 I-Frame 播放列表的简单方法是不正确的,所以我使用了 iframe-playlist-generator 中的方法。输出与Duvrai 提到的mediafilesegmenter -output-single-file -file-base output-dir/ input.ts
生成的I-Frame 播放列表几乎相似,但有时随机帧有一些188 字节大小的未命中,我无法理解模式,因此目前被忽略。
【讨论】:
听起来有点困难,但肯定更节省资源。 如果我之前通过第三个应用创建了 TS 段,并且所有这些段都在一个文件夹中,我该如何创建 .m3u8?【参考方案3】:您可以使用标准分段器(例如 Apple 的 mediafilesegmenter
),检查文件的长度,然后将它们(使用 cat
程序)连接成一个文件。根据文件大小,您可以获得在播放列表文件中指定字节范围所需的所有信息。
不如从网上下载一个工具那么好,但它不是一个很复杂的算法。
【讨论】:
其实你可以直接mediafilesegmenter -output-single-file -file-base output-dir/ input.ts
。它生成 一个 新的 MPEG-TS 文件以及一个 iframe_index.m3u8
和一个 prog_index.m3u8
。另请注意,Apple 的 HTTP 实时流媒体工具可在 developer.apple.com/downloads/… 获得,但仅适用于 99 美元/年的 ios 开发者帐户。【参考方案4】:
Unified Streaming 还提供了一个可以为您完成此任务的工具:
mp4split --package-hls output-single-file -o prog_index.m3u8 input.mp4
这是他们的商业流媒体包的一部分(他们根据要求提供免费试用)。他们还提供按小时收费的Amazon AWS instance。
【讨论】:
以上是关于如何为 HLS 创建字节范围的 m3u8 播放列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 中的 HLS(m3u8) 播放期间找出当前的 TS 段?