Node.js-MJPEG TCP流到base64图像

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

基于lib,我正在尝试从Node.js服务器中的MJPEG流(使用GStreamer通过TCP流传输)获取base64图像,并通过WebSocket将它们发送给客户端

我想我已经很接近了,但是我的图像被破坏了。以下是我正在使用的代码:

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给我的代码,它从不输出任何东西,任何提示?成功了,只是我的边界出了问题。非常感谢!(我把完整的工作流程放在这里:)