我的最终目标是将视频从我的笔记本电脑流式传输到服务器。我试图通过在笔记本电脑和服务器上使用 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 时,底部总是缺少一个块。
在最终版本中,目标是一个接一个地发送一个 jpg,并通过诸如“EndOfFile”之类的关键字来分隔每个“jpg”的结尾。我试图通过在发送之前将关键字“EndOfFile”附加到我的base64编码图像来做到这一点,但在接收端确实搞砸了。
高级服务器示例:
fs.readFile('original.jpg', 'base64', function(err, image){
image += 'EndOfFile';
socket.write(image, 'base64');
});
一个客户端,循环将检查关键字的每个数据块,如果找到它,则缓冲区中的任何内容都将写入文件并重置缓冲区,为下一个文件做好准备。
高级客户端示例
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 中并不那么舒服。
如果有人能告诉我这是否是一种理智的方法,我可能在哪里出错了。
提前致谢!