动态更改ffmpeg输入

时间:2017-03-11 15:42:42

标签: video ffmpeg

我想在不知道哪个视频文件会在Linux主机上接下来的情况下不停地显示视频。这应该在本地工作,没有任何网络。我将使用ffplay播放视频。当一个视频结束时,下一个视频应该无缝播放,没有任何延迟。我试图附加到一个文件,然后用这样的ffplay播放它:

ffmpeg -re -i source.mp4 -f mpegts - >> video.ts
# In another console
ffplay video.ts

但那不起作用 - 一旦ffmpeg完成文件,ffplay就会停止播放。如果我再次运行相同的ffmpeg命令,ffplay会从一开始就用丑陋的工件播放视频。

我想要实现的目标是:

  1. 运行ffplay并忘掉它
  2. 在视频文件上运行ffmpeg。 ffplay应该自动开始播放
  3. 在视频文件上运行ffmpeg。 ffplay应该自动无缝地开始播放,但只有在完成第一个文件后
  4. 在另一个文件上运行ffmpeg ...我希望你明白这个想法
  5. 我对ffmpeg很新,所以如果我要求明显或不可能的事情,我很抱歉。我希望你能够让我走向正确的方向。

2 个答案:

答案 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播放列表,然后继续使用递增的数字继续将段写入磁盘。