首页 > 解决方案 > 如何多次将同一段包含到 m3u8 播放列表中?

问题描述

我有几个 .ts 文件,由 ffmpeg 从实时流中生成。它们都具有相同的长度(嗯,大约)。理想情况下,它们会不断生成,名称代表记录它们的日期时间(例如,“2019-04-11_10-51-40.ts”)。但它可能会发生这样的情况,即由于任何技术原因,录制被停止了一段时间并且文件尚未生成。

现在,我的任务是为某个日期时间范围创建这些文件的播放列表 - 如果此范围的一部分没有文件,我只需要显示一个黑屏。为此,我有一个与其他文件长度相同的黑色视频。所以,我正在尝试手动创建一个 .m3u8 文件,并将这个黑色视频插入到我拥有的普通视频之间的所有间隙中。例如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:34
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-51-40.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-52-15.ts
#EXTINF:25.00,
http://example.com/2019-04-11_10-52-48.ts
#EXT-X-ENDLIST

问题是,当我尝试播放此播放列表时,它无法正确播放:取决于播放器,无论序列中有多少(VLC),只有一个黑色部分正在播放,或者播放器正在播放在第一个黑色视频之后卡住(基于 hls.js 的 Chrome 或播放器的“播放 HLS M3u8”扩展程序在我们自己的服务上)。

我也尝试使用#EXT-X-DISCONTINUITY;在这种情况下,所有视频都在播放,但进度条在每次出现后都会下降到最开始#EXT-X-DISCONTINUITY,这也是一种不受欢迎的行为。例子:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:34
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:30.07,
http://example.com/black_video.ts
#EXT-X-DISCONTINUITY
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-51-40.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-52-15.ts
#EXTINF:25.00,
http://example.com/2019-04-11_10-52-48.ts
#EXT-X-ENDLIST

至于黑色视频本身,我尝试了几种选择:每个链接都指向同一个文件;每个链接指向同一个文件的不同符号链接;每个链接都指向一个单独生成的黑色视频 - 它们都不起作用。

到目前为止,我发现的唯一方法是收集该时间范围内的所有正常视频,用黑色视频文件填补空白,然后将它们合并为一个文件,ffmpeg -f concat并将连接的文件拆分回部分。但是这种方法比手动创建 m3u8 文件的工作时间更长,所以我想避免它。

那么,手动形成的播放列表无法正常工作的原因可能是什么,我该如何解决?可能是播放列表本身的问题,或者播放列表在技术上很好,但我使用的播放器可能没有完全实现规范?

TLDR:我正在手动创建 m3u8 播放列表,我想将相同的视频多次插入此播放列表。不幸的是,这样的播放列表没有正确播放:取决于播放器,无论包含多少次,这个插入的视频都只播放一次,或者在第一个插入的视频部分之后播放卡住。可能是播放列表有问题,如何解决?

标签: http-live-streamingm3u8

解决方案


在 black_video.ts 文件之前和之后添加 #EXT-X-DISCONTINUITY 标记,并将 #EXT-X-VERSION 标记更改为 5。这应该可以解决问题。这个解决方案在 VLC 播放器上对我有用。


推荐阅读