Node.js - MJPEG TCP 流到 base64 图像

标签 node.js tcp socket.io base64 mjpeg

基于 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;
        }
    });
});

有什么想法吗?

谢谢

最佳答案

chunk.toString() 将二进制 Buffer 转换为 utf8 编码的字符串(默认情况下),因此对于二进制图像数据可能会给您带来一些问题。

另一个可能有助于简化操作的选项是使用 dicer模块。这样,您的代码可能如下所示:

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);
});

关于Node.js - MJPEG TCP 流到 base64 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23370732/

相关文章:

sockets - Web 服务器如何避免 TIME_WAIT?

python - 如何在 python 中解码 TCP/IP 数据包?

node.js + express 3 + socket.io = 发送后无法设置 header

java - 由服务器发起的 TCP 连接关闭是否有利?

android - 如何使用Android应用程序控制树莓派GPIO端口?

javascript - Socket.io 连接状态确认

javascript - 使用下划线 sortBy 进行对象排序的数组

javascript - 如何在我的配置文件 node.js 中设置 baseUrl

json - package.JSON 文件不完整?

javascript - 使用 Express 运行服务器端 Javascript 版本