【发布时间】:2014-06-15 17:59:01
【问题描述】:
基于paparazzo.js lib,我正在尝试从 Node.js 服务器中的 MJPEG 流(使用 GStreamer 通过 TCP 流式传输)获取 base64 图像,并通过 websockets 将它们发送到客户端。
我想我已经很接近了,但我的图像已损坏。这是我正在使用的代码:
var boundary = "----videoboundary";
var data = "";
var tcpServer = net.createServer(function (socket) {
socket.on('data', function(chunk) {
var boundaryIndex = chunk.toString().indexOf(boundary);
if (boundaryIndex !== -1) {
// Get the image's last piece of data :
data += chunk.toString().substring(0, boundaryIndex);
// Convert the data to a base64 image and broadcast it :
var image = new Buffer(data).toString('base64');
io.sockets.emit('image', image);
// Reset the data :
data = '';
// Get the remaining data (with new image's headers) :
var remaining = chunk.toString().substring(boundaryIndex);
// Remove the new image's headers and add the remaining data :
var contentTypeMatches = remaining.match(/Content-Type:\s+image\/jpeg\s+/);
var contentLengthMatches = remaining.match(/Content-Length:\s+(\d+)\s+/);
if(contentLengthMatches != null && contentLengthMatches.length > 1) {
var newImageBeginning = remaining.indexOf(contentLengthMatches[0]) + contentLengthMatches[0].length;
data += remaining.substring(newImageBeginning);
}
else if(contentTypeMatches != null) {
var newImageBeginning = remaining.indexOf(contentTypeMatches[0]) + contentTypeMatches[0].length;
data += remaining.substring(newImageBeginning);
}
else {
var newImageBeginning = boundaryIndex + boundary.length;
data += remaining.substring(newImageBeginning);
io.sockets.emit('error', { message: 'Could not find beginning of next image' });
}
}
else {
data += chunk;
}
});
});
有什么想法吗?
谢谢
【问题讨论】:
-
我不确定,但我认为问题在于您如何使用
toString()... 默认情况下,它将缓冲区视为二进制编码,您可能需要指定 base64:toString('base64'),试一试 -
是的,问题可能是由 toString() 引起的,但我需要它来检测边界和标题。也许我需要做一些类似的事情:块 -> toString() -> 获取标题 -> 在二进制中编码标题 -> 切片原始块。
-
您说您正在尝试“获取 base64 图像”,我将其解释为图像在您收到之前已进行 base64 编码,不是这样吗?
-
不,我正在通过 TCP 从 GStreamer 接收二进制 MJPEG 流,我想将其转换为 base64 图像序列。然后我会将这些图片通过 websockets 发送给客户端。
-
啊。好吧,那么您可能会遇到问题,正如 mscdex 所述,尝试将二进制数据作为字符串处理。如果您想直接处理它(而不是通过一个为您处理细节的模块),那么您可能必须逐字节遍历缓冲区以搜索您的边界,或者您可以得到它通过使用
toString将其重新编码为一个单独的变量来工作,您只需检查边界的位置,并使用该位置直接处理缓冲区。
标签: node.js tcp socket.io base64 mjpeg