对于使用node.js创建的mjpeg流,如何以其他格式对其进行编码然后进行流式处理?

时间:2011-06-16 14:34:39

标签: node.js streaming mjpeg

我使用nodejs创建一个小应用程序,将多部分/ x混合替换数据流式传输到浏览器。

此数据是使用图像数据创建的,但图像数据可能会随时间而变化,因此在浏览器中它看起来像一个视频。图像数据是从网络摄像头创建的,因此在浏览器中它看起来像直播。

但表现不是很好。

我尝试了其他一些方法:   - 首先:使用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调用从另一个函数中的另一个进程接收图像数据。

1 个答案:

答案 0 :(得分:3)

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

如果你打算使用上面的方法,至少不要使用fs.readFile ...这会每次都将整个文件带入内存。使用util.pump()或手动使用ReadStream / WriteStream和'drain'事件来最小化内存使用。当连接多个客户端时,您的性能问题可能是垃圾收集造成的。

另一种方法可能是让后台进程将图像提供给ffmpeg以编码正确的视频流,然后再运行到ffserver以将其传输到视频播放器。