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


苹果 举个例子 支持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文件创建这样的播放列表。 那有什么工具吗?


4958
2018-05-06 14:38


起源



答案:


-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

7
2018-03-21 09:22





好像

ffprobe -show_frames media.ts -print_format json

提供有关构建此类播放列表的帧的足够信息,尽管构建它需要一些脚本。

如果我成功采用这种方法,我会用脚本更新这个答案。

更新:

这里有几个我现在发现的有用链接:

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

iframe的播放列表生成器  - python上的项目,可用于从常规播放列表中生成iframe播放列表

这不是我最初搜索过的,但是I-Frame播放列表与字节范围的播放列表类似,更适合我的任务,因此我将使用这两个项目作为参考/起点来创建一些东西有点适合我。

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

更新2:

我有 创建了一个ruby模块 可以使用提取给定.ts文件的I-Frame信息 ffprobe 并根据该信息构建I-Frame和通常的byterange m3u8播放列表(因为它是有问题的)。

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


4
2018-05-08 14:48



听起来有点困难,但肯定更有资源效率。 - vipw
如果我之前使用第三个应用程序创建TS段,并且所有这些段都在一个文件夹中,我该如何创建.m3u8? - Mr.Hyde


答案:


-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

7
2018-03-21 09:22





好像

ffprobe -show_frames media.ts -print_format json

提供有关构建此类播放列表的帧的足够信息,尽管构建它需要一些脚本。

如果我成功采用这种方法,我会用脚本更新这个答案。

更新:

这里有几个我现在发现的有用链接:

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

iframe的播放列表生成器  - python上的项目,可用于从常规播放列表中生成iframe播放列表

这不是我最初搜索过的,但是I-Frame播放列表与字节范围的播放列表类似,更适合我的任务,因此我将使用这两个项目作为参考/起点来创建一些东西有点适合我。

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

更新2:

我有 创建了一个ruby模块 可以使用提取给定.ts文件的I-Frame信息 ffprobe 并根据该信息构建I-Frame和通常的byterange m3u8播放列表(因为它是有问题的)。

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


4
2018-05-08 14:48



听起来有点困难,但肯定更有资源效率。 - vipw
如果我之前使用第三个应用程序创建TS段,并且所有这些段都在一个文件夹中,我该如何创建.m3u8? - Mr.Hyde


您可以使用Apple的标准分段器 mediafilesegmenter,检查文件的长度,然后连接(使用 cat 程序)将它们放入一个文件中。从文件大小中,您可以获得在播放列表文件中指定字节范围所需的所有信息。

不像从网上下载工具那么好,但它不是一个非常复杂的算法。


1
2018-05-07 13:14



实际上你可以直接 mediafilesegmenter -output-single-file -file-base output-dir/ input.ts。它产生 一 新的MPEG-TS文件加上 iframe_index.m3u8 和a prog_index.m3u8。另请注意,Apple的HTTP直播流工具可在以下网址获得 developer.apple.com/downloads/... 但仅适用于99美元/年的iOS开发者帐户。 - Duvrai


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

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

这是他们的商业流媒体套餐的一部分(他们根据要求提供免费试用)。他们还提供了一个 亚马逊AWS实例 每小时收费。


0
2017-07-24 09:37