我用 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 调用从另一个函数中的另一个进程接收图像数据。
最佳答案
您可以尝试使用 socket.io 来推送生成文件的 URL,然后在客户端使用 Javascript 替换显示框架的 img 标签的“src”属性。在这种情况下,您可以使用常规 Web 服务器来为静态文件提供服务,或者使用连接模块来为静态文件提供服务。这可能比推送 base64 编码数据更有效。
如果您打算使用上述方法,至少不要使用 fs.readFile... 这每次都会将整个文件带入内存。使用 util.pump() 或手动使用带有“drain”事件的 ReadStream/WriteStream 来最小化内存使用。当有多个客户端连接时,您的性能问题可能是由于垃圾回收造成的。
另一种方法可能是有一个后台进程,将图像提供给 ffmpeg 以编码适当的视频流,然后提供给 ffserver 以将其流式传输到视频播放器。
关于node.js - 对于使用 node.js 创建的 mjpeg 流,如何将其编码为另一种格式,然后进行流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6373662/