我有几个.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)中播放的,或者播放器在第一个黑色视频之后就被卡住了( Chrome的“play HLS M3u8”扩展,或者是基于hls.js的自己服务的播放器)。
我还尝试使用#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播放列表,我希望在这个播放列表中多次插入相同的视频。不幸的是,这样的播放列表没有被正确地播放:取决于播放器,不管包含多少次,这个插入的视频只播放一次,或者播放在第一个插入的视频部分之后就被卡住了。可能是播放列表有问题,如何解决这个问题呢?
发布于 2019-04-12 16:44:34
在black_video.ts文件前后添加一个#EXT-X-不连续标记,并将#EXT-X-版本标记更改为5,这将解决问题。这个解决方案在VLC播放器上对我有效。
https://stackoverflow.com/questions/55652711
复制相似问题