使用nodejs实时播放HLS文件
Realtime HLS file playback with nodejs
我构建了一个 php crud 应用程序,允许用户上传视频并将它们排队等待转换,我使用 FFMPEG 将它们转换为 M3U8 播放列表格式。我现在需要构建一个流媒体服务器,允许我实时播放这些文件,以便当用户浏览到该页面时,他们可以看到当前播放的视频。我知道 nodejs 具有流媒体功能,并且已经对视频流进行了大量研究,并且即将推出。有人能用这个给我指出正确的方向吗?我有一个使用网络套接字的概念,但找不到可以帮助我解决问题的示例。
您正在考虑构建一个视频流平台,这是一件非常困难的事情(这不仅仅是简单地将二进制流从节点服务器传输到客户端,这就是您的想法)。
您正在考虑使用提供该功能的服务,例如 Microsoft Azure 媒体服务。我知道亚马逊 AWS 也有这样的服务,但你需要检查一下,我只有 Microsoft AMS 的经验。
事实上,这样的服务将允许将 HLS、MP4 片段和 MPEG-DASH 格式作为实时事件播放给客户端,甚至为不同的 bitrates/resolutions 提供自适应流媒体功能。您可以查看示例 HERE 并检查这是否是您要查找的内容。
如果您想以 video-on-demand (VOD)
的形式播放上传的视频,您只需将生成的片段和 m3u8 播放列表放在可通过网络访问的目录中即可通过您的网络服务器。
您可以使用 node.js 通过提供即时生成的 m3u8.[=19 根据您的完整播放列表轻松模拟 live playlist
=]
例如:
- 为每个新的客户端会话获取初始连接时间
- 对于客户端发送的每个新 GET 请求,使用初始时间和请求时间之间的差异以及完整 m3u8 中的媒体片段持续时间计算当前播放片段索引播放列表。这将是播放列表中的最后一个元素。
- 找到前面的
i - n
段,其中 n
是您想要的滑动尺寸 - window。如果当前 window 大小小于目标持续时间的三倍,则增加 n
。使用 i - n
作为 #EXT-X-MEDIA-SEQUENCE
值。
- 编写包含
n
个结果片段的播放列表
- 为每个会话的每个请求重复 2-4。
通过适当地管理时间偏移,您还可以进行时移等。为了性能,将片段按播放时间编入索引 memcached
。
我构建了一个 php crud 应用程序,允许用户上传视频并将它们排队等待转换,我使用 FFMPEG 将它们转换为 M3U8 播放列表格式。我现在需要构建一个流媒体服务器,允许我实时播放这些文件,以便当用户浏览到该页面时,他们可以看到当前播放的视频。我知道 nodejs 具有流媒体功能,并且已经对视频流进行了大量研究,并且即将推出。有人能用这个给我指出正确的方向吗?我有一个使用网络套接字的概念,但找不到可以帮助我解决问题的示例。
您正在考虑构建一个视频流平台,这是一件非常困难的事情(这不仅仅是简单地将二进制流从节点服务器传输到客户端,这就是您的想法)。
您正在考虑使用提供该功能的服务,例如 Microsoft Azure 媒体服务。我知道亚马逊 AWS 也有这样的服务,但你需要检查一下,我只有 Microsoft AMS 的经验。
事实上,这样的服务将允许将 HLS、MP4 片段和 MPEG-DASH 格式作为实时事件播放给客户端,甚至为不同的 bitrates/resolutions 提供自适应流媒体功能。您可以查看示例 HERE 并检查这是否是您要查找的内容。
如果您想以 video-on-demand (VOD)
的形式播放上传的视频,您只需将生成的片段和 m3u8 播放列表放在可通过网络访问的目录中即可通过您的网络服务器。
您可以使用 node.js 通过提供即时生成的 m3u8.[=19 根据您的完整播放列表轻松模拟 live playlist
=]
例如:
- 为每个新的客户端会话获取初始连接时间
- 对于客户端发送的每个新 GET 请求,使用初始时间和请求时间之间的差异以及完整 m3u8 中的媒体片段持续时间计算当前播放片段索引播放列表。这将是播放列表中的最后一个元素。
- 找到前面的
i - n
段,其中n
是您想要的滑动尺寸 - window。如果当前 window 大小小于目标持续时间的三倍,则增加n
。使用i - n
作为#EXT-X-MEDIA-SEQUENCE
值。 - 编写包含
n
个结果片段的播放列表 - 为每个会话的每个请求重复 2-4。
通过适当地管理时间偏移,您还可以进行时移等。为了性能,将片段按播放时间编入索引 memcached
。