有关节点多线程,媒体消耗和传递到HTTP响应的问题

问题描述

简短中,我有一个有趣的问题:如何在NodeJS(12+)中的线程之间共享信息。

技术栈-简而言之:

  • 远程/在线流服务器,它产生MP4实时流
  • 仅通过HTTP上的RTSP占用实时视图的客户端应用程序
  • 一个基于NodeJS的小型应用程序,用于获取MP4,对其进行转换并将其通过管道传输回客户端。

我使用的模块:

  • NodeJS 12 +
  • 请求/获取/ https模块
  • 快递模块
  • 流模块

故事: 我有一个应用程序,它在两个不同的系统之间具有网关/中继角色。一个提供实时媒体流(简单的MP4(h264)流),另一个提供通过HTTP作为RTSP使用。奇怪的是,消费者客户端的行为不像其他任何播放器(例如VLC或网络播放器),有时-看似随机-重新发送请求,有时关闭当前请求并重新发送。因此,直接管道在此用例中并非真正有效。

我从worker_threads中创建了一个工作程序,该工作程序保存一个可读流对象,并且当客户端发出请求时,我开始将MP4流填充到该工作程序中的可读对象中,因此即使该流确实得到了一个关闭或重新发送,将不会中断实时媒体流的消费过程。 无论客户端连接到哪里,我都只想为它传递可读对象。

最初,尽管从request / fetch / http.get或FFMPEG这样的简单管道就足够了,但是客户端可以在3秒到2分钟之间拨打电话。

所以,我的问题是,什么是最好的解决方案,将工作人员的数据传递回主服务器并进行HTTP路由?

我有一些想法,例如:

  • 我知道,我可以在线程之间拥有自己的通道,并且可以传递来回信息,但是据我所知,等待消息并保持进程确实阻止了应用程序({{1} )。
  • 使用Socket.io将数据从工作线程传回,在主体中填充可读内容,并在http级别通过管道传输可读内容(基本上是伪共享对象)
  • 创建辅助HTTP服务器以提供媒体流,然后我将其中继到响应中(例如:网关/代理)
  • 查找一些代理解决方案,我可以在其中简单地重定向和重塑内容,例如将输入mp4转换为RTSP流并将其通过管道传递给消费者响应
  • 我应该只是“记住”活动流,并且如果它是由远程服务器流式传输的,始终仅使用相同的URL,传递给FFMPEG并继续通过管道传输到res?

注意:

  • 我设置了所有标头以保持连接状态,但客户端软件似乎保持原样。
  • 认情况下,它使用RTSP和RTP / TCP来消耗视频流,但可以选择通过http进行RTSP。
  • 可能我忽略了从远程实时MP4提供RTSP视频的一些琐碎任务,但是我在任何地方都找不到任何好的示例或来源(基本上在同一地方转载了3篇文章
  • 我没有找到任何类似的问题,也没有在任何地方找到文章(但签出了nodejs ffmpeg play video at specific time and stream it to client)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)