我正在编写一个代理mjpeg视频流的应用程序。我认为从推送的mjpeg流中提取每个帧、将其进行base64编码并通过WebSockets发布到前端作为data-uri图像呈现出来是很酷的。这样,那些不支持mjpeg的客户端就能够将实时视频视为一系列图像来查看。
问题是我无法找出如何从MJPEG边界之间提取JPEG数据。以下是边界(以及头部)的样式:
在这些边界和标头的两侧是一堆杂乱无章的数据,我假设这是一个原始JPEG图像。我正在使用HTTP请求获取MJPEG,它会响应一系列块,直到流结束(大约一分钟后)。
现在我只需要弄清楚"getFrames"需要做什么来检查缓冲区是否包含完整的图像,然后将该图像作为base64编码字符串返回,同时返回缓冲区的剩余部分(包含下一个图像头)。
问题是我无法找出如何从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,它会响应一系列块,直到流结束(大约一分钟后)。
var boundary = extractBoundary(response.headers['content-type'])
, buffer = [];
response.on('data', function(chunk) {
buffer.push(chunk);
var frames = getFrames(buffer, boundary);
if(frames[0]) {
camera.set('data', "data:image/jpeg;base64," + frames[0]);
}
if(frames[1]) {
buffer = [new Buffer(frames[1])];
}
});
response.on('end', function() {
console.log('done');
});
现在我只需要弄清楚"getFrames"需要做什么来检查缓冲区是否包含完整的图像,然后将该图像作为base64编码字符串返回,同时返回缓冲区的剩余部分(包含下一个图像头)。