node.js - 对于使用 node.js 创建的 mjpeg 流,如何将其编码为另一种格式,然后进行流式传输?

标签 node.js streaming mjpeg

我用 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/

相关文章:

javascript - React Native - 违反不变性 : Objects are not valid as a React Child (Using Node JS for backend)

node.js - Mongoose upsert 不创建默认模式属性

java - Android AudioTrack 播放速度快

c# - 在 C# 中创建 MJPEG 视频流

actionscript-3 - Motion JPEG 的规范是什么?

javascript - Redis,带分页的排序集

html - 为什么我不能将我的 css 链接到我的 ejs 文件?

hadoop - 使用 Kafka 加载 HDFS 有哪些选项?

streaming - 在桌面应用程序上流式传输 youtube 视频的最佳方式

ios - 如何发送 jpeg 的多部分响应