我有几个.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或我们自己的服务上的“ Play HLS M3u8”扩展程序,适用于Chrome或播放器)后,播放器卡住了。
我还尝试使用#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播放列表,我想多次将同一视频插入此播放列表。不幸的是,这样的播放列表无法正确播放:取决于播放器,插入的视频无论被播放多少次都只能播放一次,或者在第一个插入的视频部分之后播放会停滞。可能是播放列表有问题,如何解决?
答案 0 :(得分:0)
在black_video.ts文件之前和之后添加#EXT-X-DISCONTINUITY标签,并将#EXT-X-VERSION标签更改为5。这应该可以解决此问题。此解决方案在VLC播放器上对我有用。