使用嵌入式设备上的Nodej流式传输图像

时间:2015-08-25 18:29:41

标签: javascript node.js

我尝试将图像从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 Streamssocket.io-streams,甚至是Binary.js(虽然我不愿意要求我们的客户拥有过于现代化的浏览器)但他们看起来很有前途,但我不太清楚哪个最适合我的用例。任何帮助或指导将不胜感激。

我开发的网络界面是基于FPGA(Zynq-7000)的运行PetaLinux的相机,Node.js交叉编译为ARM处理器,所以我没有很多服务器 - 与之配合使用的资源。因此,我希望客户端尽可能多地进行处理。最终,流媒体视频将令人难以置信,但我对以合理的速度阅读和显示连续帧感到满意。

1 个答案:

答案 0 :(得分:0)

这可能是由于socket.io库中的内存泄漏(请参阅here以获取说明,here表示建议的修复。)

要解决此问题,请从here下载并使用最新版本的socket.io。