我尝试将图像从Node.js服务器流式传输到客户端站点。我已经开始使用socket.io
,但我的实现相当耗费内存(并且可能因为我不能流利使用JavaScript而泄漏)。我现在只用10个样本图像进行原型设计:
使用以下函数响应socket.io
触发器" streams"每隔约100毫秒向客户端发送10张图像。
socket.on('img_trigger', function(data) {
var img_num = 0;
var timeoutHandle = null;
function startTimeout() {
stopTimeout();
if (img_num < 10) {
timeoutHandle = setTimeout(updateStream, 100);
}
}
function stopTimeout() {
clearTimeout(timeoutHandle);
}
function updateStream() {
var file = './sampleframes/sample-' + img_num + '.png';
fs.readFile(file , function(err, file_buff) {
if (err !== null) {
console.log('readFile error: ' + err);
} else {
socket.emit('img_stream', { buffer: file_buff });
}
file_buff = null;
++img_num;
});
startTimeout();
}
// kicks off first image
startTimeout();
});
捕获原始缓冲区数据并生成带有<img>
元素的PNG。
socket.on('img_stream', function(data) {
var img_data = arrayBufferToBase64(data.buffer);
var panel = $('#frame-panel');
$('#frame').html('<img src="data:image/png;base64,' +
img_data + '" width="' + panel.width() + '" height="' +
panel.height() + '" />');
});
如果我触发服务器一次,它工作正常,但不是很好。我注意到内存使用量显着上升,并在几次触发后崩溃。我可以在这里改进我的代码以提高效率,还是应该尝试一种新方法?
我已经研究过使用Node's File Streams,socket.io-streams,甚至是Binary.js(虽然我不愿意要求我们的客户拥有过于现代化的浏览器)但他们看起来很有前途,但我不太清楚哪个最适合我的用例。任何帮助或指导将不胜感激。
我开发的网络界面是基于FPGA(Zynq-7000)的运行PetaLinux的相机,Node.js交叉编译为ARM处理器,所以我没有很多服务器 - 与之配合使用的资源。因此,我希望客户端尽可能多地进行处理。最终,流媒体视频将令人难以置信,但我对以合理的速度阅读和显示连续帧感到满意。