如何为HLS创建字节范围m3u8播放列表?

14

苹果公司在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文件创建这样的播放列表。 有相关的工具吗?

4个回答

10

有一个ffmpeg选项-hls_flags。(https://www.ffmpeg.org/ffmpeg-formats.html)

以下命令生成单个ts文件,该文件使用m3u8索引文件中的字节范围功能进行分段(从HLS版本4开始支持)。

$ ffmpeg -i sample.mp3 -hls_time 20 -hls_flags single_file out.m3u8

7
看起来像是:
ffprobe -show_frames media.ts -print_format json

提供足够的帧信息来构建播放列表,但需要一些脚本编写才能构建它。

如果我成功了,我会用脚本更新这个答案。

更新:

这是我现在找到的一些有用链接:

用于生成iframe播放列表的Bash脚本 - 需要进行一些优化,因为它多次调用ffprobe

iframe-playlist-generator - 一个python项目,可以用来从通常的播放列表生成iframe播放列表

这不完全是我最初搜索的内容,但是I-Frame播放列表与字节范围播放列表类似,并且更适合我的任务,所以我将使用这两个项目作为参考/起点,创建一些更适合我的东西。

实际上,这两个项目使用不同的方法来查找I-Frame的大小 - bash脚本只使用ffprobe在pkt_size中显示的内容,而python项目通过计算数据包位置之间的差异并添加188来匹配apple的示例播放列表,添加了一些神秘的东西。字节是mpeg-ts分组的大小,可能与某种相关性有关,但是我还没有理解它的方式。这种大小计算上的差异会导致生成不同的播放列表,可能其中一个在某种程度上是不正确的,但实际上VLC可以播放两个版本,并且没有任何问题,因此我将坚持更简单的方法,直到证明它是不正确的为止。

更新2:

我已经创建了一个ruby模块,可以使用ffprobe提取给定的.ts文件的I-Frame信息,并基于该信息构建I-Frame和常规的byterange m3u8播放列表(如问题所要求)。

我发现之前提到的创建I-Frame播放列表的简单方法是不正确的,因此我使用了iframe-playlist-generator中的方法。输出与由Duvrai提到的mediafilesegmenter -output-single-file -file-base output-dir/ input.ts生成的I-Frame播放列表几乎相似,但有时候会有一些随机帧的188字节大小漏掉,我无法理解这种模式,因此目前忽略它。


听起来有点困难,但肯定更加资源高效。 - vipw
如果我之前使用第三方应用程序创建了TS分段,并且它们都在一个文件夹中,那么我如何创建.m3u8文件? - Dr.jacky

1
你可以使用标准分段器,例如苹果的mediafilesegmenter,检查文件长度,然后使用cat程序将它们连接成一个文件。通过文件大小,您可以获取所有要在播放列表文件中指定的字节范围所需的信息。
不像从网上下载工具那样方便,但这不是一个非常复杂的算法。

3
实际上,您可以直接运行mediafilesegmenter -output-single-file -file-base output-dir/ input.ts命令。它会生成一个新的MPEG-TS文件,以及一个iframe_index.m3u8和一个prog_index.m3u8文件。还请注意,苹果HTTP Live Streaming工具可在https://developer.apple.com/downloads/index.action?=http%20live%20streaming%20tools下载,但仅限于每年99美元的iOS开发者账户。 - Duvrai

0

统一流媒体 还提供了一个可以为您完成此操作的工具:

mp4split --package-hls output-single-file -o prog_index.m3u8 input.mp4

这是他们商业流媒体套餐的一部分(他们可以提供免费试用)。此外,他们还提供Amazon AWS实例,按小时收费。


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