我有几个.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”扩展程序)之后卡住了。
我也尝试用#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播放列表,我想多次将同一视频插入此播放列表。不幸的是,这样的播放列表无法正确播放:取决于播放器,插入的视频无论被播放多少次都只能播放一次,或者在第一个插入的视频部分之后播放会停滞。播放列表可能有问题,如何解决?
在black_video.ts文件之前和之后添加#EXT-X-DISCONTINUITY标签,并将#EXT-X-VERSION标签更改为5。这应该可以解决此问题。这个解决方案在VLC播放器上对我有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句