node.js - NodeJS、OpenCV 和使用 Net Socket 的流图像

标签 node.js sockets opencv video-streaming base64

我的最终目标是将视频从我的笔记本电脑流式传输到服务器。我试图通过在笔记本电脑和服务器上使用 NodeJs 来实现这一点。我使用 OpenCV 库在笔记本电脑上捕获视频并将其保存为 jpg 文件。然后我读取该文件并将其转换为 base64,以便我可以使用 Node.js 中的 Net.socket 模块传输它。这是一个连续的过程:捕获、编码和发送。

这里是只传输一个jpg文件的服务器代码:

var cv = require('opencv');
var fs = require('fs');
var net = require('net');
var camera = new cv.VideoCapture(0);
var server = net.createServer();
server.listen('50007', '127.0.0.1');

server.on('connection', function(socket){
    camera.read(function(image){
        image.save('original.jpg');

        fs.readFile('original.jpg', 'base64', function(err, image){
            socket.write(image, 'base64', function(){
                socket.end();
            });
        });
    });
});

在客户端上循环,直到从服务器收到 FIN。这是客户端代码:

var net = require('net');
var fs = require('fs');
var client = new net.Socket();
var buffer ='';
client.setEncoding('base64');

client.connect('50007', '127.0.0.1', function(){
    console.log('Connecting to server...');
});

client.on('data', function(data){
    buffer += data;
});

client.on('end', function(){
    var dataBuffer = new Buffer(buffer, 'base64');
    fs.writeFile('copy.jpg', dataBuffer, function(err){
        if(err){
            console.log(err);
        }
    });
});

问题是整个图像实际上并没有被发送。当我打开接收到的文件copy.jpg时,底部总是少了一 block 。

在最终版本中,目标是一个接一个地发送 jpg 并通过关键字(例如“EndOfFile”)分隔每个“jpg”的结尾。我试图通过在发送之前将关键字“EndOfFile”附加到我的 base64 编码图像来做到这一点,但在接收端确实搞砸了。

示例高级服务器:

fs.readFile('original.jpg', 'base64', function(err, image){
    image += 'EndOfFile';
    socket.write(image, 'base64');
}); 

循环的客户端会检查每个数据 block 中的关键字,如果它找到它,那么缓冲区中的任何内容都将写入文件并重置缓冲区,为下一个文件做好准备。

示例高级客户端

client.on('data', function(data){
    if(data.indexOf('EndOfFile') > 0){
        buffer += data.substr(0, data.indexOf('EndOfLine'));
        var dataBuffer = new Buffer(buffer, 'base64');

        fs.writeFile('copy.jpg', dataBuffer, function(err){
            if(err){
                console.log(err);
            }
        });

        buffer = '';
    } else {
        buffer += data;
    }
});

我已经让它在 Python 中工作,所以我认为我的逻辑是正确的,但我在 NodeJS 中不太舒服。

如果有人能告诉我这是否是一种明智的做法,我可能哪里出错了。

提前致谢!

最佳答案

我怀疑您在最后一位数据仍在缓冲时看到了 end 事件。

尝试等待 close 事件而不是 end 事件。我不确定套接字,但在 spawn 等其他 Node API 中,end 事件在刷新相关流之前提前触发,因此可能仍有缓冲数据等待。

您可以避免通过管道自己管理它。使用 fs.createWriteStream().pipe() 套接字流到文件。

关于node.js - NodeJS、OpenCV 和使用 Net Socket 的流图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845742/

相关文章:

c - 关于集群客户端服务器通信的任何建议。方法?

sockets - RPC clnt_call 立即发送 tcp [FIN, ACK]

c++ - 仿射变换(剪切)opencv c++

c++ - 如何以最快的方法删除那些指定的标签组件

node.js - kafka Node 无法在本地环境中连接到kafka服务器

node.js - Nodejs 应用程序如何向我的另一个 https 服务器请求?

javascript - 使用 twitter API 有时会出错

node.js - 将异步代码视为 Node.js 中的线程?

python - Socket.IO 与 Twisted

opencv - 如何围绕轮廓绘制矩形?