好像
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 来匹配示例播放列表来添加一些巫术来自苹果。188 字节是 mpeg-ts 数据包的大小,可能与此有关,但是我还没有设法理解。这种大小计算的差异导致生成不同的播放列表,可能其中一个在某种程度上是不正确的,但实际上 VLC 播放两者都没有任何问题,所以我将坚持使用更简单的方法,直到它被证明是不正确的。
更新 2:
我创建了一个 ruby 模块,它可以提取给定 .ts 文件的 I-Frame 信息,ffprobe
并根据该信息构建 I-Frame 和通常的字节范围 m3u8 播放列表(如问题所要求的那样)。
我发现我之前提到的创建 I-Frame 播放列表的简单方法是不正确的,所以我使用了 iframe-playlist-generator 中的方法。输出几乎类似于Duvraimediafilesegmenter -output-single-file -file-base output-dir/ input.ts
提到的由生成的 I-Frame 播放列表,但有时随机帧有一些 188 字节大小的未命中,我无法理解这种模式,因此目前被忽略。