物联网(java版本)臻识摄像头+本地实时显示视频

2023-11-16

 

部分代码显示

package com.xdnnaovideo.videoservice.listenermessage;


import com.google.gson.Gson;
import com.xdnnaovideo.videoservice.entity.AddAndUpdateRtspVo;
import com.xdnnaovideo.videoservice.entity.AjaxResult;
import com.xdnnaovideo.videoservice.rtsp.MediaConstant;
import com.xdnnaovideo.videoservice.rtsp.MediaStart;
import org.apache.commons.lang3.StringUtils;
import org.bytedeco.javacv.FrameGrabber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import javax.jms.TextMessage;

@Component
public class ActivemqListener {
    @Autowired
    MediaStart mediaStart;

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Value("${webserviceluwairstp}")
    String webserviceluwairstp;

    @JmsListener(destination = "${webserviceluwairstp}")
    public void webserviceluwairstp(TextMessage message) {
        try {
            AddAndUpdateRtspVo addAndUpdateRtspVo = new Gson().fromJson(message.getText(), AddAndUpdateRtspVo.class);
            String type = addAndUpdateRtspVo.getType();
            if("start".equals(type)){
                convertexsetting(addAndUpdateRtspVo);
                logger.info("设置数据rstp进来:" + addAndUpdateRtspVo);
            }else if("stop".equals(type)){
               stopconvertexsetting(addAndUpdateRtspVo);
                logger.info("设置数据rstp进来:" + addAndUpdateRtspVo);
            }

            message.acknowledge();

        } catch (Exception error) {
            logger.error("发生错误:{}", error.getMessage());
        }

    }

    private void convertexsetting(AddAndUpdateRtspVo addAndUpdateRtspVo) {
        String linkId = addAndUpdateRtspVo.getLinkIdDeviceInfo();
        String rtspPath = addAndUpdateRtspVo.getRtspPath();


        boolean haveSameFFmpegFrameGrabberCache = MediaConstant.isHaveSameFFmpegFrameGrabberCache(linkId.trim(), rtspPath.trim());
        boolean haveSamertspPath = MediaConstant.isHaveSamertspPath(rtspPath.trim());
        String linkIdCopy = MediaConstant.getLinkId(rtspPath.trim());
        // 当要修改的rtspPath地址不是在存在准备修改的linkId上,而是存在其他linkId上,则不允许修改,这样做是避免同时解析两个相同的rtsp地址导致流错乱
        if (haveSameFFmpegFrameGrabberCache && haveSamertspPath) {
            logger.info("输入参数存在有误,要更改的rtspPath地址已经存在于其他链路上,不允许在此链路修改,请移步先将链路:[" + linkIdCopy + "]的rtsp地址更改后再来更改");
            return;
        }
        MediaConstant.FFmpegFrameGrabberCache fFmpegFrameGrabberCache1 = MediaConstant.getFFmpegFrameGrabberCache(linkId.trim());
        String message = "";
        // 如果为空,则说明没有添加过该链路的FFmpegFrameGrabberCache
        if (fFmpegFrameGrabberCache1 == null) {
            MediaConstant.FFmpegFrameGrabberCache fFmpegFrameGrabberCache =
                    new MediaConstant.FFmpegFrameGrabberCache()
                            .setLinkId(linkId.trim())
                            .setRtspPath(rtspPath.trim());
            MediaConstant.fFmpegFrameGrabberCaches.put(linkId.trim(), fFmpegFrameGrabberCache);
            message = "添加" + linkId + ":rtsp地址成功";
        } else { // 如果不为空,则要将该链路对应的数据更改为初始化状态,添加新的信息
            try {
                fFmpegFrameGrabberCache1.getGrabber().stop();
            } catch (FrameGrabber.Exception e) {
                logger.error("FrameGrabber stop exception: ", e);
            }
            fFmpegFrameGrabberCache1.setRtspPath(rtspPath)
                    .setLinkId(linkId)
                    .setGrabber(null)
                    .setIsStart(false);
            message = "修改" + linkId + ":rtsp地址成功";
        }
        //启动当前链路线程
        mediaStart.addLinkThreadPool(linkId.trim());
    }

    private void stopconvertexsetting(AddAndUpdateRtspVo addAndUpdateRtspVo) {
        String linkId = addAndUpdateRtspVo.getLinkIdDeviceInfo();
        String rtspPath = addAndUpdateRtspVo.getRtspPath();
        MediaConstant.FFmpegFrameGrabberCache fFmpegFrameGrabberCache1 = MediaConstant.getFFmpegFrameGrabberCache(linkId.trim());
        // 如果为空,则说明没有添加过该链路的FFmpegFrameGrabberCache
        if (fFmpegFrameGrabberCache1 != null) {
            try {
                fFmpegFrameGrabberCache1.getGrabber().stop();
            } catch (FrameGrabber.Exception e) {
                logger.error("FrameGrabber stop exception: ", e);
            }
            fFmpegFrameGrabberCache1.setRtspPath(rtspPath)
                    .setLinkId(linkId)
                    .setGrabber(null)
                    .setIsStart(false);
        }
        MediaConstant.removeisHaveSameFFmpegFrameGrabberCache(linkId.trim());
        MediaConstant.removeisHaveSameFFmpegFrameGrabberCache(linkId.trim());
    }
}

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

物联网(java版本)臻识摄像头+本地实时显示视频 的相关文章

  • 无法访问类型的封闭实例。 [复制]

    这个问题在这里已经有答案了 整个代码是 public class ThreadLocalTest ThreadLocal
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 如何从 WifiP2pDeviceList 获取 wifi direct 设备名称

    我想在执行请求对等点时获取 wi fi direct 名称 这是我的代码 if WifiP2pManager WIFI P2P PEERS CHANGED ACTION equals action Log d tag success dis
  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 是否可以从另一个方法传递 args[] 来调用 main 方法?

    我试图从另一个传递参数的方法调用类的主要方法 就像从命令行运行该类时一样 有没有办法做到这一点 您可以致电main方法就像您调用任何其他 静态 方法一样 MyClass main new String arg1 arg2 arg3 Exam
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我

随机推荐