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

Posted

技术标签:

【中文标题】如何使用 FFMPEG 创建持续时间恒定的 m3u8 播放列表和 mpeg-ts 块?【英文标题】:How to create m3u8 playlist and mpeg-ts chunks with constant duration by using FFMPEG? 【发布时间】:2016-01-14 03:36:47 【问题描述】:

我有 mp4 文件(Big Buck Bunny): 时长:00:09:56.50 比特率:2048 kb/s 尺寸:1280x720 帧率:29.97 我在 2 秒后设置了恒定关键帧。 我想为 HLS 准备这个视频。 我用它来生成 m3u8 播放列表并生成 ts 块:

ffmpeg -i input.mp4 -hls_time 2 out.m3u8

但不幸的是,我不明白它是如何工作的。 我认为这个命令会生成 298 个 2 秒的块,但它只生成 152 个不同长度(3 - 9 秒)的块。 但最奇怪的是它创建了只有 5 个文件链接的 m3u8 文件。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:148
#EXTINF:8.341667,
out148.ts
#EXTINF:7.841167,
out149.ts
#EXTINF:0.967633,
out150.ts
#EXTINF:8.341667,
out151.ts
#EXTINF:7.140467,
out152.ts
#EXT-X-ENDLIST

我认为 m3u8 文件必须包含视频的所有部分。有人可以解释一下如何每 2 秒创建 298 个块并正确填充 m3u8 文件吗?

【问题讨论】:

只有VODEVENT 播放列表包含所有片段,而后者仅在活动结束时才包含。 LIVE 播放列表使用滑动窗口。 【参考方案1】:

要每 2 秒强制一个关键帧,您可以使用 -g 指定 GOP 大小:

ffmpeg -i input.mp4 -g 60 -hls_time 2 out.m3u8

其中 29.97 fps * 2s ~= 60 帧,表示每 60 帧一个关键帧。

否则它将等待在关键帧上分割,并且最短持续时间会有所不同。

要保留所有段添加-hls_list_size 0,否则只保留默认值5。

【讨论】:

aergistal,你一如既往地帮助了我。非常感谢! 我收到了 Option hls_list_size not found 的 ffmpeg 版本 3.3.4 @ben.IT 它仍然存在于最新版本中。检查命令语法,该选项应应用于输出。

以上是关于如何使用 FFMPEG 创建持续时间恒定的 m3u8 播放列表和 mpeg-ts 块?的主要内容,如果未能解决你的问题,请参考以下文章

linux: m3u8: 如何从 .m3u8 中列出的段手动下载和创建 mp4

ffmpeg进行视频切片,生成m3u8

使用 FFMPEG 创建 HLS 变体

使用ffmpeg编码时,如何设置恒定码率,并控制好关键帧I帧间隔

在 ffmpeg 中从单个图像创建特定持续时间的视频

使用PowerShell和FFMPEG将音频和字幕源条带化并添加到INDEX.M3U8