4

我用 nodejs 创建了一个小应用程序,它将 multipart/x-mixed-replace 数据流式传输到浏览器。

这个数据是用图像数据创建的,但是图像数据可能会随着时间而改变,所以在浏览器中它看起来像一个视频。图像数据是从网络摄像头创建的,因此在浏览器中它看起来像实时流媒体。

但是性能不是很好。

我尝试了其他一些方法: - 首先:使用 socket.io 将图像推送到浏览器,这里我使用图像中的 base64 数据(推送此数据)并在浏览器中重新创建图像(jpeg):效果很好,但只有一两个客户。_ 第二:使用从浏览器到 nodejs 服务器的轮询.. 这不喜欢我。

所以这是代码:(我的nodejs服务器的部分代码)我使用express来制作http服务器:

app.get('/videoStream',function(req,response){   
    response.writeHead(200,{
        'Content-Type': 'multipart/x-mixed-replace;boundary="' + boundary + '"',
        'Connection': 'keep-alive',
        'Expires': 'Fri, 01 Jan 1990 00:00:00 GMT',
        'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate',
        'Pragma': 'no-cache'
    });
    response.write('--'+boundary+'\n');

    events.addListener('imagen_recibida',function(){
        fs.readFile(__dirname + '/image.jpeg',function(err,data){
             if(err) return send404(response);
             response.write('Content-Type: image/jpeg\n Content-Length: '+data.length+'\n\n');
             response.write(data);
            response.write('\n--'+boundary+'\n');
           });
    });

当事件“imagen_recibida”上升时,它从磁盘读取图像并将数据写入浏览器。

所以两个问题:

有什么方法可以提高性能吗?(将图像写入磁盘然后读取以发送到浏览器看起来不是一个好技巧)

有没有办法将其编码为另一种格式以提高性能?

非常感谢。

PD:图像被写入磁盘,然后读取以发送到浏览器,因为我通过 RPC 调用从另一个函数中的另一个进程接收图像数据。

4

1 回答 1

3

您可以尝试使用 socket.io 来推送生成文件的 URL,然后在客户端使用 Javascript 替换显示框架的 img 标记的“src”属性。在这种情况下,您可以使用常规 Web 服务器来提供静态文件或连接模块来提供静态文件。这可能比推送 base64 编码数据更有效。

如果您要使用上述方法,至少不要使用 fs.readFile... 这每次都会将整个文件放入内存。使用 util.pump() 或手动使用带有 'drain' 事件的 ReadStream/WriteStream 以最大限度地减少内存使用。当连接了多个客户端时,您的性能问题可能是由于垃圾收集造成的。

另一种方法可能是有一个后台进程,将图像馈送到 ffmpeg 以编码适当的视频流,然后将其馈送到 ffserver 以将其流式传输到视频播放器。

于 2011-06-16T15:08:30.633 回答