从ts文件列表创建m3u8文件

8

我希望从ts文件列表中创建'm3u8'文件。有什么方法吗?

我在谷歌上搜索并阅读了ffmpeg的文档,但没有找到相关信息。


已经有一个答案:https://stackoverflow.com/a/51274324/560435 如果您想将ts文件列表中的每个条目制作成播放列表中的一个条目,请注意 - #EXT-X-DISCONTINUITY 将列表条目分隔开。请查看“不连续性”的规范,以了解如何构建自己的列表。 - Robert Rowntree
3个回答

8

不清楚你是在问以下哪种情况,所以这里为两种情况给出一个快速答案:

  1. 如果你有一个包含内容的单个文件 这是最常见的情况。通常,从源材料创建可播放的HlS流需要三个步骤。
  • 对于每个期望输出级别(比如说比特率),您需要创建一组分段的 .ts 文件。
  • 对于每个输出级别,您需要一个包含构成内容的段文件列表的播放列表清单(m3u8)。
  • 对于整个流,您需要一个单独的主清单(另一个 m3u8),其中列出了所有播放列表。

FFMpeg 可以完成这三个步骤。

  1. 如果你有一组 .ts 文件 如果你真的有一组 .ts 文件,你可以像前一个答案中描述的那样手动构建一个 m3u8 文件,或者编写一个脚本来完成。

无论哪种情况,都需要考虑 .ts 文件的一些问题:

  • 如果片段文件不属于连续的序列(例如,它们是从单个源剪辑转码用于HLS),则需要在没有相同编码特性或没有单调递增PTS(演示时间戳)值的片段之间插入EXT-X-DISCONTINUITY标记。

  • 虽然片段的长度不需要全部相同,但最长的片段不能超过EXT-X-TARGETDURATION标记指定的秒数(整数)。

  • "对于VOD内容,平均片段比特率必须在AVERAGE-BANDWIDTH属性的10%范围内"

当您构建m3u8文件时,通过验证器运行它可以帮助您查找任何问题。这比在各种播放器/浏览器中猜测为什么HLS流播放效果不佳或不一致要容易得多。


如何在不知道每个.ts文件的持续时间的情况下手动创建m3u8文件? - Misagh

3
可以使用Bash脚本完成:
#!/usr/bin/env bash
file="hls.m3u8"
echo "#EXTM3U" > $file
echo "#EXT-X-VERSION:3" >> $file
echo "#EXT-X-MEDIA-SEQUENCE:24" >> $file
echo "#EXT-X-TARGETDURATION:10" >> $file    
for i in `find *.ts -type f | sort -g`; do
    l=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $i)
    echo "#EXTINF:$l," >> $file
    echo "$i" >> $file
done    
echo "#EXT-X-ENDLIST" >> $file

2
您可能想要一个HLS结构。在苹果公司有很多文档资料(我记得它最初是由苹果公司发明并广泛采用的),例如一份草案RFC一个包含示例流的页面
HLS由两个级别组成:一个主M3U8引用其他M3U8,这些M3U8又引用.ts文件。您可以省略主M3U8,直接提供“第二级”。
作为起点,它可能看起来像这样
#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
< p > EXT-X-TARGETDURATION 指定每个 .ts 文件的持续时间(它们必须都具有相同的长度)。它可以是相对路径或绝对路径。


1
谢谢。我了解HLS,我想从我的ts文件创建播放列表(m3u8),而不必重新创建它们。我必须手动创建和编辑m3u8文件还是可以使用ffmpeg? - Mohammad Hossein Gerami
为什么不使用Bash脚本来创建这个文件呢? - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接