video - 即时更改 ffmpeg 输入

标签 video ffmpeg

我想在不事先知道 Linux 主机上的下一个视频文件的情况下不间断地显示视频。这应该在本地工作,无需任何网络。我打算用 ffplay 播放视频。当一个视频完成后,下一个视频应该无缝播放,没有任何延迟。我试图附加到一个文件,然后像这样用 ffplay 播放它:

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

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

我想要实现的是:
  • 运行 ffplay 并忘记它
  • 在视频文件上运行 ffmpeg。 ffplay 应该会自动开始播放
  • 在视频文件上运行 ffmpeg。 ffplay 应该自动无缝地开始播放它,但只有在它完成第一个文件
  • 之后才能开始播放。
  • 在另一个文件上运行 ffmpeg... 我希望你明白

  • 我对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/

    相关文章:

    silverlight - Silverlight 视频播放器可以播放 Azure blob 中的 wmv 吗?

    用于 ffmpeg 命令的文件识别的正则表达式

    ffmpeg 检测立体声 channel 是否实际上是单声道

    audio - 录制屏幕视频和音频 - Windows 7

    video - 在自己的播放器中播放 Youtube、Vimeo 和任何其他视频服务的视频

    php - 无法在 Safari/Mac (5.0) 上通过 PHP 提供 HTML5 视频

    python - python中的ffmpeg xstack布局

    ffmpeg - 要求ffmpeg以原始帧速率提取帧

    android - 使用 ffmpeg 将 mp4 从 Linux 直播到 Android

    java - 使用 Xuggler 设置视频中每帧的持续时间