我想在不事先知道 Linux 主机上的下一个视频文件的情况下不间断地显示视频。这应该在本地工作,无需任何网络。我打算用 ffplay 播放视频。当一个视频完成后,下一个视频应该无缝播放,没有任何延迟。我试图附加到一个文件,然后像这样用 ffplay 播放它:
ffmpeg -re -i source.mp4 -f mpegts - >> video.ts
# In another console
ffplay video.ts
但这不起作用 - 一旦 ffmpeg 处理完文件,ffplay 就会停止播放。如果我再次运行相同的 ffmpeg 命令,ffplay 从一开始就播放带有丑陋伪影的视频。
我想要实现的是:
我对ffmpeg真的很陌生,所以如果我要求一些明显或不可能的事情,我很抱歉。我希望你能把我引向正确的方向。
最佳答案
我已经设法通过以下命令获得了我想要的东西(通过遵循 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 实现的协议(protocol)。简而言之,它非常简单 - 它只是在文本文件中列出视频 block 及其持续时间,以便播放器知道接下来要播放哪个 block 。玩家不需要事先知道有多少 block 以及下一个 block ——这些正是我的要求。
为了完成这项工作,我添加了
-f hls
标记到 ffmpeg 命令。它使 ffmpeg 获取输入视频,将其分割成 block ,保存它们并为 HLS 消费者生成一个播放列表(在我的例子中是 ffplay)。但我想确保播放列表是无限的。默认情况下,ffmpeg 会在 m3u8 文件中添加一个终止命令。为了防止这种情况,并确保 ffmpeg 清理并且不会覆盖现有的播放列表,我添加了这些标志:
-hls_flags delete_segments+append_list+omit_endlist
.我还使用
-hls_list_size 30
将播放列表中的默认 block 数更改为 30旗帜。结果是我可以播放的无限视频
ffplay out.m3u8
.当ffmpeg
命令完成,我只需要使用我接下来要播放的视频重新运行它。播放器自动拾取所有内容。当然,当当前视频播放结束时,我仍然必须确保准备好下一个视频。另外,我怀疑如果我运行
ffmpeg
快速连续的命令可能会导致正在播放的视频卡顿 - 因为 ffmpeg 可以清理尚未播放的 block ,但 ffmpeg 认为它们是旧的。
关于video - 即时更改 ffmpeg 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42737129/