从 ts 文件列表创建 m3u8 文件

Posted

技术标签:

【中文标题】从 ts 文件列表创建 m3u8 文件【英文标题】:Create m3u8 file from list of ts files 【发布时间】:2019-02-02 19:01:51 【问题描述】:

我想从 ts 文件列表中创建“m3u8”文件。我该怎么做?

我确实在谷歌搜索并阅读了 ffmpeg 的文档,但我没有找到任何东西。

【问题讨论】:

已经是一个答案:***.com/a/51274324/560435 如果您想获取 ts 文件列表,使该列表中的每个条目成为播放列表中的一个条目。注意 - #EXT-X-DISCONTINUITY 分隔列表条目的 .查看“不连续性”规范,了解更多关于构建您自己的列表的信息 【参考方案1】:

尚不清楚您要问的是以下哪种情况,因此以下是对这两种情况的快速回答:

    如果您从包含内容的单个文件开始 这是最常见的情况。一般来说,从源素材创建可播放的 HlS 流需要三个步骤。
对于每个所需的输出级别(为简单起见,我们假设比特率),您需要创建一个分段的 .ts 文件的集合。 对于每个输出级别,您需要一个播放列表清单 (m3u8),其中包含组成内容的分段文件列表。 对于整个流,您需要一个列出播放列表的主清单(另一个 m3u8)。

FFMpeg 可以做到这三个方面。

    如果您从一组 .ts 文件开始 如果您真的从 .ts 文件的集合开始,您可以按照上一个答案中的描述手动构建一个 m3u8 文件,或者您可以编写一个脚本来执行此操作。

在任何一种情况下,.ts 文件都有一些注意事项:

如果片段文件不属于不间断序列(就像它们是从单个源剪辑转码以用于 HLS 一样),您需要在不属于的片段之间插入 EXT-X-DISCONTINUITY 标签t 具有相同的编码特征或不具有单调递增的 PTS(表示时间戳)值。

虽然段不需要都具有相同的长度,但最长的段不得超过 EXT-X-TARGETDURATION 标记中指定的(整数)秒数。

“对于 VOD 内容,平均分段比特率必须在 AVERAGE-BANDWIDTH 属性的 10% 以内”

当您构建了 m3u8 文件后,通过验证器运行它以发现任何问题会有所帮助。这比挠头想知道为什么 HLS 流在播放器/浏览器之间播放效果不佳或不一致要容易得多。

macOS 上的mediaStreamValidator 非常好https://developer.apple.com/documentation/http_live_streaming/about_apple_s_http_live_streaming_tools 还可以考虑 Theo 的在线工具:http://inspectstream.theoplayer.com/

【讨论】:

如何在不知道每个 .ts 文件持续时间的情况下手动创建 m3u8 文件?【参考方案2】:

您可能想要一个HLS 结构。有很多documentation at Apple(IIRC 它是由 Apple 发明的,然后被广泛采用),例如a draft RFC 和 page with example streams。

HLS 由两个级别组成:一个主 M3U8,它引用其他 M3U8,而后者又引用 .ts 文件。您可以省略主 M3U8,只提供“第二级”。

作为起点,它may look something like this:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10, no desc
media-000001.ts
#EXTINF:10, no desc
media-000002.ts
#EXTINF:10, no desc
media-000003.ts

EXT-X-TARGETDURATION 指定每个.ts 文件的长度(它们的长度必须相同)。它可以是相对路径或绝对路径。

【讨论】:

谢谢。我知道 hls。我想从我的 ts 文件创建播放列表(m3u8)而不重新创建它们。必须手动创建和编辑 m3u8 文件,或者我可以使用 ffmpeg。

以上是关于从 ts 文件列表创建 m3u8 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 m3u8 播放列表中的 ts 文件

如何使用 FFMPEG 创建持续时间恒定的 m3u8 播放列表和 mpeg-ts 块?

TS 文件不播放 hls.js

Python 实现 m3u8 视频下载

AVPlayer 没有从本地文件播放 m3u8

如何将m3u8的ts文件合并到mp4?