Node.js 从MJPEG流中提取JPEG并在websocket上发布base64编码图像

Node.js 从MJPEG流中提取JPEG并在websocket上发布base64编码图像,node.js,http,header,streaming,mjpeg,Node.js,Http,Header,Streaming,Mjpeg,我正在编写一个代理mjpeg视频流的应用程序。我认为从mjpeg服务器(我代理的服务器)推送的mjpeg中提取每个帧,base64编码并在WebSocket上发布该帧,以便在前端作为数据uri图像呈现,这将是一件很酷的事情。这样,不支持mjpeg的客户端将能够以图像序列的形式查看实时视频 问题是我不知道如何从MJPEG边界之间提取jpeg数据。以下是边界(以及标题)的外观: --------JPEG_FRAME_BOUNDARY Content-Type: image/jpeg Content-

我正在编写一个代理mjpeg视频流的应用程序。我认为从mjpeg服务器(我代理的服务器)推送的mjpeg中提取每个帧,base64编码并在WebSocket上发布该帧,以便在前端作为数据uri图像呈现,这将是一件很酷的事情。这样,不支持mjpeg的客户端将能够以图像序列的形式查看实时视频

问题是我不知道如何从MJPEG边界之间提取jpeg数据。以下是边界(以及标题)的外观:

--------JPEG_FRAME_BOUNDARY
Content-Type: image/jpeg
Content-Length: 33377
X-Frame-Epoc-HiRes: 1383166748.031929
X-Frame-Timestamp: 2013-10-30T20:59:08.031929Z
X-Resource-Status: active
在这些边界和标题的两侧都是一堆乱码数据,我假设这些数据是原始jpeg图像

我使用http请求获取mjpeg,该请求用一系列块进行响应,直到流结束(大约一分钟后)


现在我只需要弄清楚“getFrames”需要做什么来检查缓冲区是否包含完整的图像,然后将该图像作为base64编码字符串与缓冲区的剩余块(包含下一个图像头的位,on)一起返回。

所以不知怎的,我错过了Paparazzo.js——这太棒了,为我节省了大量时间。基本上,在解析标题时需要知道两件重要的事情

首先,您需要知道最后一行标题是什么(我的标题是“X-Resource-Status:active”)。让我感到困惑的是,您需要使用\s而不是\r\n作为标题的结尾。因此,您应该匹配以下内容:

var headerEnd = remaining.match(/X-Resource-Status: active\s+/);
基本上,您可以循环从流接收的块,并找到最后一个头的末尾的索引。获取一个子字符串,从最后一个头的端点开始,然后等待处理程序再次调用,以查找下一个头的开头

下一个棘手的问题是,必须使用缓冲区将图像转换为base64(或任何其他格式)。因此,您不必获取刚刚解析出来的帧并在其上调用.toString('base64'),而必须执行新的缓冲区(image).toString('base64')

这里是狗仔队消息来源的链接,这样你就可以更好地了解我在说什么:

看到了吗
var headerEnd = remaining.match(/X-Resource-Status: active\s+/);