NodeJS、OpenCV 和使用 Net Socket 的流图像

2024-02-26

我的最终目标是将视频从我的笔记本电脑流式传输到服务器。我正在尝试通过在笔记本电脑和服务器上使用 NodeJs 来完成此任务。我使用 OpenCV 库在笔记本电脑上捕获视频并将其保存为 jpg 文件。然后,我读取该文件并将其转换为 base64,以便我可以使用 Node 中的 Net.socket 模块传输它。这是一个连续的过程:捕获、编码和发送。

以下是仅传输一个 jpg 文件的服务器代码:

var cv = require('opencv');
var fs = require('fs');
var net = require('net');
var camera = new cv.VideoCapture(0);
var server = net.createServer();
server.listen('50007', '127.0.0.1');

server.on('connection', function(socket){
    camera.read(function(image){
        image.save('original.jpg');

        fs.readFile('original.jpg', 'base64', function(err, image){
            socket.write(image, 'base64', function(){
                socket.end();
            });
        });
    });
});

在客户端上,我循环直到从服务器收到 FIN。这是客户端代码:

var net = require('net');
var fs = require('fs');
var client = new net.Socket();
var buffer ='';
client.setEncoding('base64');

client.connect('50007', '127.0.0.1', function(){
    console.log('Connecting to server...');
});

client.on('data', function(data){
    buffer += data;
});

client.on('end', function(){
    var dataBuffer = new Buffer(buffer, 'base64');
    fs.writeFile('copy.jpg', dataBuffer, function(err){
        if(err){
            console.log(err);
        }
    });
});

问题是整个图像实际上并没有被发送。当我打开收到的文件 copy.jpg 时,底部总是缺少一块。

在最终版本中,目标是发送一张又一张的 jpg,并通过“EndOfFile”等关键字分隔每个“jpg”的结尾。我尝试在发送之前将关键字“EndOfFile”附加到我的 base64 编码图像中来做到这一点,但在接收端确实搞砸了。

高级服务器示例:

fs.readFile('original.jpg', 'base64', function(err, image){
    image += 'EndOfFile';
    socket.write(image, 'base64');
}); 

在客户端,循环将检查每个数据块中的关键字,如果找到它,则缓冲区中的任何内容都将写入文件,并重置缓冲区,为下一个文件做好准备。

高级客户端示例

client.on('data', function(data){
    if(data.indexOf('EndOfFile') > 0){
        buffer += data.substr(0, data.indexOf('EndOfLine'));
        var dataBuffer = new Buffer(buffer, 'base64');

        fs.writeFile('copy.jpg', dataBuffer, function(err){
            if(err){
                console.log(err);
            }
        });

        buffer = '';
    } else {
        buffer += data;
    }
});

我已经让它在 Python 中工作,所以我认为我的逻辑是正确的,但我在 NodeJS 中不太舒服。

如果有人能告诉我这是否是一种明智的方法,以及我可能在哪里出错了。

提前致谢!


我怀疑你正在看到end当最后一位数据仍在缓冲时发生事件。

尝试等待close事件而不是end事件。我不确定套接字,但在其他 Node API 中,例如spawn, the end事件在相关流被刷新之前提前触发,因此可能仍然有缓冲数据在等待。

您可以通过管道来避免自己管理这个问题。使用fs.createWriteStream() and .pipe()文件的套接字流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS、OpenCV 和使用 Net Socket 的流图像 的相关文章

  • 如何在node.js中分离TCP套接字消息

    我正在尝试使用 TCP 套接字 并且对消息如何到达我的应用程序感到困惑 看来他们已经分手了 有人知道我怎样才能最好地将他们重新组合在一起吗 所有消息均以换行符分隔 r n var stream net createConnection po
  • MongoDB 查询返回空数组

    有一个基本的 Express 应用程序连接到几乎 0 5 GB 的 MongoDB 数据库 当我运行时 router get function req res next medical data find State CT function
  • 无法分配请求的地址 - 可能的原因?

    我有一个由主服务器和分布式从服务器组成的程序 从属服务器向服务器发送状态更新 如果服务器在固定时间内没有收到特定从属服务器的消息 则会将该从属服务器标记为关闭 这种情况一直在发生 通过检查日志 我发现从站只能向服务器发送一个状态更新 然后永
  • 如何使用 node.js 请求模块使用我自己的证书进行 SSL 调用?

    我正在使用 node js 和此请求模块对另一台服务器进行 HTTP 调用 https github com mikeal request https github com mikeal request 效果很好 我现在需要修改此代码以使用
  • 显示来自 mongodb 的所有数据并在 doT.js 模板引擎中渲染它

    我想从 mongodb 中提取数据并将其传递给视图 一切似乎都正常 但我没有看到所有 10000 条记录都显示出来 而是只看到了一条 我觉得我非常接近解决它 但我陷入困境 我正在使用node mongodb native express和d
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 如何从 WinRT StreamSocket 读取所有可用数据并清空 inputStream?

    我想在向套接字写入新数据之前读取当前正在等待套接字的所有数据 WinRT中的读取方法都是异步的 所以我不能简单地while直到套接字为空 由于我确实想丢弃套接字上的数据 因此我不想使用读取器 而是直接从套接字读取数据IInputStream
  • 使用单个“proxyServer”将 Websocket 代理到多个目标

    我正在开发一个nodeJS websocket代理服务器 用例是当 websocket 请求到来时 我将检查其凭据 添加新标头 然后根据其组 来自用户 ID 将 websocket 连接重定向到其目标 webscoket 服务器 我发现大多
  • AWS SDK S3 node.js 连接到本地 MinIO 服务器

    我有用 Node js 编写的应用程序服务器 它将文件上传到 AWS S3 存储 为此我正在使用https www npmjs com package aws sdk https www npmjs com package aws sdk当
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • Node.js 客户端中的 Windows 集成身份验证

    当使用node js作为客户端时 是否可以使用Windows集成身份验证连接到服务器 例如连接到IIS时 我对此的搜索仅出现使用 node js 作为服务器的结果 2015 年更新 现在有一些模块实现了 Windows 集成身份验证 节点
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • Slack Webhook - 获取 Invalid_Payload

    我正在尝试设置 Slack 的 Webhook 但收到 Invalid Payload 错误消息 我浏览过 Stack Slack 和 Github 但找不到我想要的答案 为了保护隐私 其中的 自定义链接 正在使用实际链接 CODE var
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • 如何在 MongoDB v3.0.5 中创建用户

    我需要在 mongodb 中为我的数据库创建一个用户 但似乎我无法让它工作 我已经在我的 Windows 7 机器上安装了 mongoDb v3 0 5 根据本文 https docs mongodb org v3 0 tutorial a
  • nvm代理设置配置文件

    在Linux下 我使用 http proxy and https proxy这适用于node and npm but nvm不使用它们 我应该在哪个配置文件中写入代理设置 uname a Linux Breizh Atao 3 19 0 3
  • 从 node.js 创建对 AWS ES 实例的有效签名请求

    我试图找到一个示例 说明如何连接到 Node js 中的 AWS ES 实例 然后通过一个简单的请求访问 ES 集群 我正在尝试使用elasticsearch节点包 https www npmjs com package elasticse
  • gjs 如何使用 g_data_input_stream_read_line_async 在 Gnome Shell 扩展中读取套接字流

    我正在尝试编写一个 Gnome Shell 扩展 通过 Socket 服务器与 Arduino 进行通信 服务器和 Arduino 运行良好 但我陷入了监听传入服务器消息的扩展代码 因为我需要一种非阻塞方法 所以使用异步读取行 https
  • Docker-compose:npm 安装成功后卷中不存在 node_modules

    我有一个具有以下服务的应用程序 web 在端口 5000 上保存并运行 python 3 Flask Web 服务器 使用 sqlite3 worker 有一个index js文件是队列的工作人员 Web 服务器通过端口使用 json AP

随机推荐