Node.js-MJPEG TCP流到base64图像
基于lib,我正在尝试从Node.js服务器中的MJPEG流(使用GStreamer通过TCP流传输)获取base64图像,并通过WebSocket将它们发送给客户端 我想我已经很接近了,但是我的图像被破坏了。以下是我正在使用的代码:Node.js-MJPEG TCP流到base64图像,node.js,tcp,socket.io,base64,mjpeg,Node.js,Tcp,Socket.io,Base64,Mjpeg,基于lib,我正在尝试从Node.js服务器中的MJPEG流(使用GStreamer通过TCP流传输)获取base64图像,并通过WebSocket将它们发送给客户端 我想我已经很接近了,但是我的图像被破坏了。以下是我正在使用的代码: var boundary = "----videoboundary"; var data = ""; var tcpServer = net.createServer(function (socket) { socket.on('data', func
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;
}
});
});
有什么想法吗
感谢chunk.toString()
将二进制缓冲区转换为utf8编码的字符串(默认情况下),因此对于可能会给您带来一些问题的二进制图像数据
另一个可能有助于简化工作的选项是使用该模块。这样,您的代码可能如下所示:
var Dicer = require('dicer');
var boundary = '----videoboundary';
var tcpServer = net.createServer(function(socket) {
var dice = new Dicer({ boundary: boundary });
dice.on('part', function(part) {
var frameEncoded = '';
part.setEncoding('base64');
part.on('header', function(header) {
// here you can verify content-type, content-length, or any other header
// values if you need to
}).on('data', function(data) {
frameEncoded += data;
}).on('end', function() {
io.sockets.emit('image', frameEncoded);
});
}).on('finish', function() {
console.log('End of parts');
});
socket.pipe(dice);
});
我不确定,但我相信问题在于如何使用
toString()
。。。默认情况下,它将缓冲区视为二进制编码,您可能需要指定base64:toString('base64')
,如果是shotYes,则问题可能是由toString()引起的,但我需要它来检测边界和标头。也许我需要做一些类似的事情:chunk->toString()->get headers->encode headers in binary->slice original chunk。你说你在尝试“获取base64图像”,我解释为图像在接收之前是base64编码的,不是这样吗?不,我正在通过TCP从GStreamer接收二进制MJPEG流,我想把它转换成一系列base64图像。然后我将通过websockets.Ah将这些图像发送给客户端。好吧,然后你可能会遇到问题,正如msdex所说的,通过尝试将二进制数据作为字符串来处理。如果您想直接处理它(而不是通过为您处理细节的模块),那么您可能必须逐字节循环缓冲区以搜索边界,或者,您可以使用toString
将其重新编码为一个单独的变量,您只需检查边界的位置,并使用该位置直接处理缓冲区即可使其工作。好的,对于toString,这似乎是合乎逻辑的,但您知道如何检测二进制块中的边界和头吗?我试过你用Dicer给我的代码,它从不输出任何东西,任何提示?成功了,只是我的边界出了问题。非常感谢!(我把完整的工作流程放在这里:)