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

问题描述 投票:0回答:4

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

但我不知道如何为给定的 .ts 文件创建这样的播放列表。 有什么工具可以做到这一点吗?

http-live-streaming m3u8
4个回答
10
投票

-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
投票

看起来像

ffprobe -show_frames media.ts -print_format json

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

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

更新:

这是我现在找到的几个有用的链接:

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

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

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

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

更新2:

我已经创建了一个 ruby 模块,它可以使用

ffprobe
提取给定 .ts 文件的 I 帧信息,并根据该信息构建 I 帧和通常的字节范围 m3u8 播放列表(如所要求的那样)。

我发现之前提到的创建 I-Frame 播放列表的简单方法是不正确的,所以我使用了 iframe-playlist-generator 中的方法。输出几乎与

Duvrai
提到的 mediafilesegmenter -output-single-file -file-base output-dir/ input.ts 生成的 I 帧播放列表类似,但有时随机帧会丢失一些 188 字节大小的内容,我无法理解该模式,因此目前将其忽略。


1
投票

您可以使用标准分段器,例如 Apple 的

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.