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

bio*_*cer 11 http-live-streaming m3u8

Apple 提供了一个支持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
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何为给定的.ts文件创建这样的播放列表.那有什么工具吗?

小智 7

-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
Run Code Online (Sandbox Code Playgroud)


bio*_*cer 5

好像

ffprobe -show_frames media.ts -print_format json
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

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

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

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

该项目实际使用不同的方法来寻找I帧的大小 - 在bash脚本只是采用什么ffprobe显示pkt_size和Python项目通过计算尺寸数据包的位置的差异,增加188匹配例如播放列表增添了几分巫术的来自苹果.188字节是mpeg-ts数据包的大小,可能是以某种方式相关,但是我还没有理解如何.大小计算的这种差异导致生成不同的播放列表,可能其中一个在某种程度上是不正确的,但实际上VLC都没有任何问题,所以我将坚持使用更简单的方法,直到它被证明是不正确的.

更新2:

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

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