grpc-spring 通信(监控视频传输)

news2024/9/27 19:27:10

先看效果

这是微软相机,22ms延迟 (不走网络存粹寄存器和内存的通信)在这里插入图片描述这是程序抓取摄像头然后传给client,client的java窗口展示的,延时也是22ms(对了localhost好像也不走网络吧)在这里插入图片描述

几个点
1.opencv如何引用
2. .proto
3. stub选择

opencv引用

opencv是平台相关的,毕竟他要访问硬件,借助操作系统。所以maven gradle这种东西就不太支持这样的组件,windows下的直接用opencv开发的例子可以找很多
下面是一个

https://blog.csdn.net/qq_37131111/article/details/126588443

但我找到了一个更好用的。可以更轻松的平台迁移(只需要把.dll 或者.so 放到javahome/bin下就可以)。

https://github.com/openpnp/opencv

gradle引用

dependencies {
	//不知道为什么在最外层的build.gradle里加就不可以
	implementation('org.openpnp:opencv:4.5.1-2')  (90MB下很长时间 ,连英国很快)
}

下载dll

org.openpnp:opencv:4.5.1-2,需要的是opencv_java451.dll ,即opencv 4.5.1版本。
https://opencv.org/releases/page/2/
在这里插入图片描述
.dll放到 javahome/bin下

代码里使用

server里
启动的时候加载

@SpringBootApplication
public class LocalGrpcServerApplication {

    static {
        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
        //add opencv_java451.dll to C:\Program Files\Java\jdk-17.0.2\bin
    }

    public static void main(String[] args) {
        SpringApplication.run(LocalGrpcServerApplication.class, args);
    }
}
int camId = request.getCameraId();
        VideoCapture cap = null;
        try {
            System.out.println("-----z--1----" + camId);
            cap = new VideoCapture(camId);
            //} catch (Exception e) {
        } catch (Throwable e) {
            System.out.println("-----------");
//            e.printStackTrace();
            e.getMessage();
        }

        Mat frame = new Mat();
        MatOfByte buf = new MatOfByte();

        while (cap.grab()) {
            Date date = new Date();
            cap.read(frame);
            Imgcodecs.imencode(".png", frame, buf);
            CameraStreamResponse response =
                    CameraStreamResponse.newBuilder()
                            .setFrame(ByteString.copyFrom(buf.toArray()))
                            //.setFrame(buf.toArray())
                            .setTimestamp(date.getTime())
                            .build();

            responseObserver.onNext(response);

        }

        cap.release();
        responseObserver.onCompleted();

client

@SpringBootApplication
public class LocalGrpcClientApplication {

    public static void main(String[] args) {

//        SpringApplication.run(LocalGrpcClientApplication.class, args);

// 用有头模式启动, 才可以有java窗口
        SpringApplicationBuilder builder = new SpringApplicationBuilder(LocalGrpcClientApplication.class);
        builder.headless(false).run(args);
    }

}
 public void cameraStream(int  camId)  {
        CameraStreamRequest cameraStreamRequest = CameraStreamRequest.newBuilder().setCameraId(camId).build();
        Iterator<CameraStreamResponse> cameraStreamResponses = cameraStreamBlockingStub.cameraStream(cameraStreamRequest);

        JFrame window = null;
        try {
            window = new JFrame();
        } catch (HeadlessException e) {
            e.printStackTrace();
        }
        JLabel screen = new JLabel();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        ImageIcon ic = null;
        try {
            ic = new ImageIcon(ImageIO.read(new File("C:\\Users\\king\\IdeaProjects\\grpc-spring\\examples\\local-grpc-client\\src\\main\\java\\net\\devh\\boot\\grpc\\examples\\local\\client\\loadImage.png")));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        screen.setIcon(ic);
        window.setContentPane(screen);
        window.pack();
        int i = 99;

        while(cameraStreamResponses.hasNext()) {
            i++;
            CameraStreamResponse response = cameraStreamResponses.next();
            ic = new ImageIcon(response.getFrame().toByteArray());
            screen.setIcon(ic);
            window.setContentPane(screen);
            window.pack();
            if (i % 100 == 0) {
                System.out.println(response.getTimestamp() );
            }
        }
        window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSED));

    }

这里注意
使用的是cameraStreamBlockingStub
也可以使用 cameraStreamStub
一个同步一个异步。后者是操作见上个文章里的server steaming里的client端

用哪个以后看效果。

哦 .proto

// Camera stream service definition
service CameraStream {
    // Method to connect and start receiving camera frames
    rpc CameraStream(CameraStreamRequest) returns (stream CameraStreamResponse) {}
}

// camera id
message CameraStreamRequest {
    int32 cameraId = 1;
}

// Camera frame message
// 帧编码压缩, client 缓冲接收 //也许可以不压缩 (现在是1.5G的光纤,配上超六类网线也许可以不压缩) //使用模拟摄像头软件(不,有摄像头)
message CameraStreamResponse {
    bytes frame = 1;
    int64 timestamp = 2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大功率舞台灯调光调色方案 | 支持深度调光,多路输出调光 36V/48V/60V FP7126

在舞台演出中&#xff0c;灯光扮演着非常重要的角色&#xff0c;它不仅可以烘托氛围&#xff0c;营造氛围&#xff0c;更能够为表演者增添光彩&#xff0c;塑造形象。在博物馆场所中&#xff0c;突出展品细节。根据灯光用途和适用类型&#xff0c;舞台灯可以细分为聚光灯、泛光…

foundation model

目录 多模态预训练模型 BLIP LLM GPT3 InstructGPT FLAN chain of thought ToolFormer QWEN Llama3 VLM QWen-VL VideoChat Video-ChatGPT 应用 DriveVLM PlanAgent 多模态预训练模型 CLIP BLIP 《Bootstrapping Language-Image Pre-training for Unified Visi…

突发!Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情?

突发&#xff01;2024年8月29日Runway 从 HuggingFace 及 GitHub 上删库跑路&#xff0c;背后有何隐情&#xff1f; &#x1f9d0; 今天我们来聊一聊科技圈一则爆炸性消息&#xff1a;Runway ML 从 HuggingFace 和 GitHub 上删库跑路&#xff0c;毫无预警&#xff01;这个举动…

基于asp.net的在线考试系统源码分享

这是一个基于asp.net的开发的在线考试系统&#xff0c;需要的小伙伴自己参考源码&#xff0c;下载链接我放在后面了。 1.主要功能 主要功能包含用户注册登陆、学生登录、老师登陆、试卷管理、分数管理、 填空题选择、选择题管理、题库管理、分数管理、试卷随机生成等等模块。…

【精选】基于Django的智能水果销售系统设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

面试必问的 Linux 命令帮你整理好啦...

01.背景 作为一名测试工程师&#xff0c;Linux 是必须要掌握的一项技能。 因为大部分的互联网公司的项目都是搭建和部署在 Linux 服务器上的&#xff0c;所以测试就算不去负责搭建和维护测试环境&#xff0c;也需要在测试过程中去服务器那边定位测试中的问题。 所以&#xf…

PTA L1-027 出租

L1-027 出租&#xff08;20分&#xff09; 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0…

这四种人不能合作做生意

合伙创业千万不要和这四种人合伙&#xff0c;不然公司做大了都不是你的&#xff01; 一、不愿出钱的人&#xff0c;不愿出钱就不会有决心。公司一旦有风吹草动&#xff0c;最先跑路的都是没有出钱的。 二、不愿付出时间的人&#xff0c;想用业余时间参与&#xff0c;不愿全身心…

Unity编辑器扩展之Hierarchy面板扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Hierarchy面板扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff…

css-functions-图形函数

概述 本文会讨论和图形函数有关的 5 个函数,分别是:inset、circle、ellipse、polygon和path。这个 5 个图形函数也对应着相应的<basic-shape>。 <basic-shape>是一种表现基础图形的 CSS 数据类型,作用于clip-path或shape-outside属性中;而其值是由图形函数获…

sfud移植

sfud移植 首先看readme文档 文件结构 inc文件夹&#xff1a;各种头文件&#xff0c;注意flash_def和cfg头文件 port文件夹&#xff1a;接口文件 src文件夹&#xff1a;代码源文件 移植 基础&#xff1a;你的SPI没问题&#xff0c;用普通工程可以正常操作Flash 首先打开f…

cloudways相关

服务器优惠链接&#xff1a; https://www.cloudways.com/en/?id1081165 cloudways 后台清缓存位置&#xff1a; 网站迁移到cloudways&#xff08;用cloudways的自动迁移插件&#xff09;&#xff1a; 不管原网站是不是用的cloudways主机&#xff0c;都可以用这个方法。 1…

【React】react项目安装tailwindcss

创建React项目 首先,如果您还没有React项目,可以使用以下命令创建一个新项目: npx create-react-app my-tailwind-app cd my-tailwind-app安装Tailwind CSS 接下来,按照以下步骤安装Tailwind CSS: 安装必要的依赖: npm install -D tailwindcss postcss autoprefixer初始化…

Kubernetes 1.31 新功能: 细粒度补充组控制

这篇文章讨论了 Kubernetes 1.31 中的一个新特性&#xff0c;用于改善 Pod 中容器的补充组&#xff08;Fine-grained SupplementalGroups control&#xff09;处理。 动机&#xff1a;在容器镜像中的 /etc/group 定义的隐式组成员身份 尽管这种行为可能并不受许多 Kubernetes…

Redis安装+常用命令合集大全+Redis Desktop Manager

文章目录 一&#xff1a;Redis 简介二&#xff1a;安装和配置Redis第一步&#xff1a;下载Redis第二步&#xff1a;解压Redis第三步&#xff1a;配置Redis第四步&#xff1a;启动Redis服务器第五步&#xff1a;验证Redis安装第六步&#xff1a;设置Redis为全局命令 三&#xff…

不同品类商标一样属于侵权吗!

商标分类有45类&#xff0c;有网友问普推知产商标老杨&#xff0c;不同品类商标一样属于侵权吗&#xff0c;这个要从多个角度来分析&#xff0c;不同品类商标是相同一样的&#xff0c;这样的基本不侵权的。 在注册申请商标是会经常遇到别人在某类别注册&#xff0c;但是有一些类…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80&#xff0c;443&#xff0c;445&#xff0c;3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

各个击破:NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时&#xff0c;光纤变得越来越重要&#xff0c;而铜缆在未来也将继续发挥重要作用&#xff0c;因此我们不仅要比较两种类型布线的优缺点&#xff0c;还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要&#xff0c;特别是在光纤情况下…

hadoop技术

历史版本 HA&#xff1a;高可用 技术框架

[线程]线程不安全问题 --- 死锁

文章目录 一. 引出死锁二. 可重用锁三. 死锁的三种典型场景四. 死锁产生的四个必要条件(面试题)1. 锁具有互斥特性2. 锁不可抢占(不可被剥夺)3. 请求和保持4. 循环等待 五. 避免死锁问题 一. 引出死锁 class Counter{private int count;public void add(){synchronized(this){…