我想在不知道哪个视频文件会在Linux主机上接下来的情况下不停地显示视频。这应该在本地工作,没有任何网络。我将使用ffplay播放视频。当一个视频结束时,下一个视频应该无缝播放,没有任何延迟。我试图附加到一个文件,然后用这样的ffplay播放它:
ffmpeg -re -i source.mp4 -f mpegts - >> video.ts
# In another console
ffplay video.ts
但那不起作用 - 一旦ffmpeg完成文件,ffplay就会停止播放。如果我再次运行相同的ffmpeg命令,ffplay会从一开始就用丑陋的工件播放视频。
我想要实现的目标是:
我对ffmpeg很新,所以如果我要求明显或不可能的事情,我很抱歉。我希望你能够让我走向正确的方向。
答案 0 :(得分:1)
我已经设法通过以下命令得到了我想要的东西(按照Ryan Williams的提示使用HLS):
ffmpeg -i source.mp4 -s 640x360 -hls_list_size 30 -hls_flags delete_segments+append_list+omit_endlist -f hls out.m3u8
这就是它起作用的原因:
HTTP Live Streaming是Apple实施的协议。简而言之,它非常简单 - 它只是在文本文件中列出视频块及其持续时间,以便玩家知道下一个要播放的块。玩家不需要事先知道有多少块以及下一块 - 这些正是我的要求。
为了完成这项工作,我在ffmpeg命令中添加了-f hls
标志。它使得ffmpeg获取输入视频,将其分成块,保存并为HLS消费者生成播放列表(在我的情况下为ffplay)。
但我想确保播放列表是无限的。默认情况下,ffmpeg会向m3u8文件添加终止命令。为了防止这种情况,并确保ffmpeg清理并且不覆盖现有的播放列表,我添加了以下标志:-hls_flags delete_segments+append_list+omit_endlist
。
我还使用-hls_list_size 30
标记将播放列表中默认的块数更改为30。
结果是我可以使用ffplay out.m3u8
播放的无限视频。当ffmpeg
命令完成时,我只需要使用我想要接下来的视频重新运行它。玩家自动选择所有内容。
当然,当目前的视频播放结束时,我仍然需要确保准备好下一个视频。另外,我怀疑如果我快速连续运行ffmpeg
命令,可能会导致正在播放的视频口吃 - 因为ffmpeg可以清理尚未播放的块,但ffmpeg认为它们已经老了。
答案 1 :(得分:0)
HTTP直播(HLS)应该可以运行,但您可能需要对视频进行转码。
基本上创建一个HLS播放列表,然后继续使用递增的数字继续将段写入磁盘。