【问题标题】:Realtime HLS file playback with nodejs使用 nodejs 实时播放 HLS 文件
【发布时间】:2015-07-13 23:28:35
【问题描述】:

我已经构建了一个 php crud 应用程序,它允许用户上传视频并将它们排队等待转换,我使用 FFMPEG 将它们转换为 M3U8 播放列表格式。我现在需要构建一个流媒体服务器,它允许我实时播放这些文件,以便当用户浏览到页面时,他们会看到当前时间正在播放的视频。我知道 nodejs 具有流式传输功能,并且已经对视频流式传输进行了大量研究,但现在还不够。有人能指出我正确的方向吗?我有一个使用网络套接字的概念,但我找不到可以帮助我解决问题的示例。

【问题讨论】:

  • 以下内容应该很有用,因为它是开源的,应该做你想做的,或者为你提供一个例子来帮助你设计自己的解决方案(如果你有很多时间......):@ 987654321@

标签: node.js sockets video streaming http-live-streaming


【解决方案1】:

如果您想以video-on-demand (VOD) 播放上传的视频,您只需将生成的片段和 m3u8 播放列表放在可通过网络服务器提供的网络可访问目录中。

您可以使用 node.js 通过提供动态生成的m3u8,根据您的完整播放列表轻松模拟live playlist

例如:

  1. 为每个新的客户端会话获取初始连接时间
  2. 对于客户端发送的每个新 GET 请求,使用初始时间与请求时间之间的差值以及完整 m3u8 播放列表中的媒体片段持续时间计算当前播放片段索引。这将是播放列表中的最后一个元素。
  3. 找到之前的i - n 段,其中n 是您想要的滑动窗口大小。如果当前窗口大小小于目标持续时间的三倍,则增加n。使用i - n 作为#EXT-X-MEDIA-SEQUENCE 值。
  4. 编写包含n 结果片段的播放列表
  5. 为每个单独会话的每个请求重复 2-4。

通过正确管理时间偏移,您还可以进行时移等。为了性能,将按播放时间索引的片段保留在 memcached 之类的位置。

【讨论】:

  • 谢谢,这正是我想要的。你是救生员,我开始拔头发了哈哈。
  • 所以为了澄清,我需要存储文件上线的时间,从那里等待请求。当收到请求时,我存储该时间并从中减去开始时间,然后将其除以 ts 段的持续时间?
  • 我选择为播放列表文件编制索引,以应对片段的持续时间不同的情况。但这就是想法,您确定客户端已经过去了多少时间,然后搜索应该播放的片段。然后生成播放列表以包含滑动窗口的先前n 段。如果播放列表发生更改,则客户端将以等于分段目标持续时间的间隔请求播放列表,如果自上次请求以来播放列表未更改,则客户端将请求播放列表的间隔等于目标持续时间的一半。见tools.ietf.org/html/…
  • 如果我每 3 秒写入一个新段会怎样?我的意思是我录制我的直播并翻译它。如何在客户端更新我的 m3u8?谢谢。
【解决方案2】:

您正在考虑构建一个视频流平台,这是一件非常困难的事情(它不仅仅是将二进制流从节点服务器传输到客户端,这就是您的想法)。

您正在考虑使用提供该功能的服务,例如 Microsoft Azure 媒体服务。我知道亚马逊 AWS 也有这样的服务,但你需要检查一下,我只有 Microsoft AMS 的经验。

事实上,这样的服务将允许将 HLS、MP4 分段和 MPEG-DASH 格式作为实时事件播放给客户端,甚至提供针对不同比特率/分辨率的自适应流媒体功能。您可以查看示例 HERE 并检查这是否是您要查找的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多