我想在不事先知道 Linux 主机上接下来会播放哪个视频文件的情况下不间断地播放视频。这应该在本地工作,没有任何网络。我打算用ffplay播放视频。当一个视频完成后,下一个应该无缝播放,没有任何延迟。我试图附加到一个文件,然后像这样用 ffplay 播放它:
ffmpeg -re -i source.mp4 -f mpegts - >> video.ts
# In another console
ffplay video.ts
Run Code Online (Sandbox Code Playgroud)
但这不起作用 - 一旦 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
Run Code Online (Sandbox Code Playgroud)
这就是它起作用的原因:
HTTP Live Streaming是 Apple 实现的协议。简而言之,它非常简单 - 它只是在文本文件中列出视频块及其持续时间,以便播放器知道接下来播放哪个块。玩家不需要事先知道有多少块以及接下来会是什么——这正是我的要求。
为了完成这项工作,我-f hls在 ffmpeg 命令中添加了标志。它使 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 认为它们很旧。
| 归档时间: |
|
| 查看次数: |
5902 次 |
| 最近记录: |