Java对接腾讯多人音视频房间回调接口示例
在前面我们已经对接好了腾讯多人音视频房间相关内容:Java对接腾讯多人音视频房间示例
为了完善业务逻辑,我们还需要对接它的一些回调接口 官方文档地址
主要就下面这些
这里因为比较简单直接上代码
里面有些工具类和上一章一样这里就没贴,需要的看下我上一章Java对接腾讯多人音视频房间示例
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;/*** @Description: 腾讯会议回调* @Author: Sakura* @Date: 2023/12/18 14:43*/
@Log
@RestController
@RequestMapping("/txcloud/callback")
public class TxCallbackController {@Value("${tencent.roomctl.SDKAppId}")private Long SDKAppId;@AutowiredTxCallbackService txCallbackService;@AutowiredCallbackListenerStrategyContext callbackListenerStrategyContext;// // 实例参数
// {
// "address": "https://www.zscloud.work:29000/api/txcloud/callback/listener",
// "actions": ["createRoom", "destroyRoom", "updateRoomInfo", "enterRoom", "exitRoom", "updateUserRole", "takeSeat", "leaveSeat"]
// }/*** @Description: 配置回调地址* @Author: Sakura* @Date: 2023/12/18 14:52*/@PostMapping("/create")public Result createCallback(@RequestBody CreateCallbackRequest createCallbackRequest) {return txCallbackService.createCallback(createCallbackRequest);}/** * @Description: 修改回调地址配置* @Author: Sakura* @Date: 2023/12/19 15:55*/@PostMapping("/update")public Result updateCallback(@RequestBody CreateCallbackRequest createCallbackRequest) {return txCallbackService.updateCallback(createCallbackRequest);}/*** @Description: 回调监听* @Author: Sakura* @Date: 2023/12/19 11:00*/@PostMapping("/listener")public CallbackResponse callbackListener(@RequestParam Long sdkappid, @RequestParam String command,@RequestParam String contenttype, @RequestParam String clientip,@RequestParam String optplatform,@RequestBody CallbackRoomInfoRequest callbackRoomInfoRequest) {log.info("回调监听:" + "sdkappid:" + sdkappid + " command:" + command + " " + callbackRoomInfoRequest.toString());// 目前只能校验SDKAppId是否一致if (!SDKAppId.equals(sdkappid)) {return CallbackResponse.ERROR();}return callbackListenerStrategyContext.callbackListener(command, callbackRoomInfoRequest);}}
/** * @Description: 多人视频管理* @Author: Sakura* @Date: 2023/12/14 17:46
*/
public interface TxCallbackService {Result createCallback(CreateCallbackRequest createCallbackRequest);Result updateCallback(CreateCallbackRequest createCallbackRequest);}
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/** * @Description: 回调管理* @Author: Sakura* @Date: 2023/12/18 14:52
*/
@Log
@Service
public class TxCallbackServiceImpl implements TxCallbackService {@AutowiredRoomctlUtil roomctlUtil;/*** @Description: 预约会议* @Author: Sakura* @Date: 2023/12/14 17:46*/@Override@Transactionalpublic Result createCallback(CreateCallbackRequest createCallbackRequest) {String result = roomctlUtil.createCallback(createCallbackRequest.getAddress(), createCallbackRequest.getActions());if (!"ok".equals(result)) {return Result.ERROR(result);}return Result.SUCCESS();}@Override@Transactionalpublic Result updateCallback(CreateCallbackRequest createCallbackRequest) {String result = roomctlUtil.updateCallback(createCallbackRequest.getAddress(), createCallbackRequest.getActions());if (!"ok".equals(result)) {return Result.ERROR(result);}return Result.SUCCESS();}}
下面是请求参数的封装类
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.List;/** * @Description: 创建回调参数* @Author: Sakura* @Date: 2023/12/18 14:50
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateCallbackRequest extends PageRequest {private static final long serialVersionUID = 1L;// 回调的地址,需要以 http/https 开头,建议使用更为安全的 httpsprivate String address;// 需要触发回调的情景,列表请参考 回调命令字private List<String> actions;}
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/** * @Description: 回调房间详细信息 * @Author: Sakura* @Date: 2023/12/19 13:43
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CallbackRoomInfoRequest implements Serializable {private static final long serialVersionUID = 1L;// 操作的用户 ID@JsonProperty("UserId")private String UserId;// 角色类型:0为房主,1为管理员,2为普通成员@JsonProperty("UserRole")private Integer UserRole;// 操作的房间 ID@JsonProperty("RoomId")private String RoomId;// 当前房间成员数量@JsonProperty("MemberCount")private Integer MemberCount;// 用户退出的原因@JsonProperty("ExitReason")private String ExitReason;// 当前的麦位数量@JsonProperty("SeatCount")private Integer SeatCount;// 房间详情@JsonProperty("RoomInfo")private RoomInfoRequest RoomInfo;// 事件触发时间戳@JsonProperty("EventTime")private Long EventTime;
}
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/*** @Description: 回调房间信息* @Author: Sakura* @Date: 2023/12/19 13:41*/
@Data
@EqualsAndHashCode(callSuper = false)
public class RoomInfoRequest implements Serializable {private static final long serialVersionUID = 1L;// 最大麦位数量,默认为套餐包上限,(直播最大16个 默认16)@JsonProperty("MaxSeatCount")private Integer MaxSeatCount;// 房间名称。默认为房间 ID@JsonProperty("RoomName")private String RoomName;// 房间类型:1为会议,2为直播\n 默认为:会议1@JsonProperty("RoomType")private Integer RoomType;// 麦控模式:1为自由发言模式,2为举手发言模式,3为就座后发言(抢麦位)\n默认为:自由发言模式1@JsonProperty("SpeechMode")private Integer SpeechMode;// 全体禁画 默认 false@JsonProperty("DisableVideo")private Boolean DisableVideo;// 全体静音 默认 false@JsonProperty("DisableAudio")private Boolean DisableAudio;// 禁止所有成员发送文本消息 默认 false@JsonProperty("DisableMessage")private Boolean DisableMessage;}
再就是回调这块,因为回调的都是一个方法,通过command来区分,所以这里用策略模式来处理
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;/*** @author Sakura* @date 2023/12/19 11:16*/
@Service
public class CallbackListenerStrategyContext {// 策略采用lambda的方法存储Map<String, Function<CallbackRoomInfoRequest, CallbackResponse>> strategyContextMap = new HashMap<>();@ResourceCallbackListenerService callbackListenerService;@PostConstruct@SneakyThrowspublic void setStrategyMap() {// 配置回调方法strategyContextMap.put("createRoom",(callbackRoomInfoRequest)-> callbackListenerService.createRoom(callbackRoomInfoRequest));strategyContextMap.put("destroyRoom",(callbackRoomInfoRequest)-> callbackListenerService.destroyRoom(callbackRoomInfoRequest));strategyContextMap.put("updateRoomInfo",(callbackRoomInfoRequest)-> callbackListenerService.updateRoomInfo(callbackRoomInfoRequest));strategyContextMap.put("enterRoom",(callbackRoomInfoRequest)-> callbackListenerService.enterRoom(callbackRoomInfoRequest));strategyContextMap.put("exitRoom",(callbackRoomInfoRequest)-> callbackListenerService.exitRoom(callbackRoomInfoRequest));strategyContextMap.put("takeSeat",(callbackRoomInfoRequest)-> callbackListenerService.takeSeat(callbackRoomInfoRequest));strategyContextMap.put("leaveSeat",(callbackRoomInfoRequest)-> callbackListenerService.leaveSeat(callbackRoomInfoRequest));}public CallbackResponse callbackListener(String command, CallbackRoomInfoRequest callbackRoomInfoRequest){// 根据command获取对应的方法返回策略Function<CallbackRoomInfoRequest, CallbackResponse> callbackListenerFunc = strategyContextMap.get(command);return callbackListenerFunc.apply(callbackRoomInfoRequest);}
}
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author Sakura* @date 2023/12/19 11:42*/
@Service
@Log
public class CallbackListenerService {// 此处用来统一处理多人视频房间回调++++++++++++++++++++++++++++++++++++++++++++// 创建房间回调public CallbackResponse createRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("创建房间回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 销毁房间回调public CallbackResponse destroyRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("销毁房间回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 更新房间回调public CallbackResponse updateRoomInfo(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("更新房间回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用户进房回调public CallbackResponse enterRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用户进房回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用户退房回调public CallbackResponse exitRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用户退房回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用户上麦回调public CallbackResponse takeSeat(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用户上麦回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用户下麦回调public CallbackResponse leaveSeat(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用户下麦回调" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}
}
返回对象
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/** * @Description: 回调返回信息* @Author: Sakura* @Date: 2023/12/19 13:41
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CallbackResponse implements Serializable {private static final long serialVersionUID = 1L;// 当前房间成员数量private Integer ErrorCode;// 操作的房间 IDprivate String ErrorMessage;public static CallbackResponse success() {CallbackResponse callbackResponse = new CallbackResponse();callbackResponse.setErrorCode(0);callbackResponse.setErrorMessage("Success");return callbackResponse;}public static CallbackResponse ERROR() {CallbackResponse callbackResponse = new CallbackResponse();callbackResponse.setErrorCode(1);callbackResponse.setErrorMessage("Fail");return callbackResponse;}}
我们需要先调用配置回调地址的接口把我们的接口配置上去
{"address": "https://www.sakura.com/txcloud/callback/listener","actions": ["createRoom", "destroyRoom", "updateRoomInfo", "enterRoom", "exitRoom", "updateUserRole", "takeSeat", "leaveSeat"]
}
注意address换成自己的域名,actions可以照着写
这样就能收到回调信息了
相关文章:

Java对接腾讯多人音视频房间回调接口示例
在前面我们已经对接好了腾讯多人音视频房间相关内容:Java对接腾讯多人音视频房间示例 为了完善业务逻辑,我们还需要对接它的一些回调接口 官方文档地址 主要就下面这些 这里因为比较简单直接上代码 里面有些工具类和上一章一样这里就没贴,需要…...

vp与vs联合开发-通过FrameGrabber连接相机
添加控件 1.CogRecordDisplay 控件 用于显示图像 初始化相机对象方法 //启动窗体时 调用初始化相机方法 //封装相机关闭方法 //窗体关闭时 调用相机关闭方法 拍照 设置采图事件 // 保存图像 设置曝光按钮事件 1.可变参数...

音视频直播核心技术介绍
直播流程 采集: 是视频直播开始的第一个环节,用户可以通过不同的终端采集视频,比如 iOS、Android、Mac、Windows 等。 前处理:主要就是美颜美型技术,以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…...

JNDI注入Log4jFastJson白盒审计不回显处理
目录 0x00 前言 0x01 Maven 仓库及配置 0x02 JNDI 注入简介 0x03 Java-第三方组件-Log4J&JNDI 0x04 Java-第三方组件-FastJson&反射 0x05 白盒审计 - FastJson 0x06 白盒审计 - Log4j 0x07 不回显的处理方法 0x00 前言 希望和各位大佬一起学习,如果…...
FPGA实现腐蚀和膨胀算法verilog设计及仿真 加报告
要在FPGA上实现腐蚀和膨胀算法,你可以按照以下步骤进行: 图像存储:首先,你需要设计一个图像存储器来存储待处理的图像数据。这可以采用FPGA内部存储器或外部存储器。 读取图像数据:使用适当的接口从图像存储器中读取图像数据,并将其加载到FPGA的计算单元中。 结构元素定义…...
核和值域的关系:什么是矩阵的秩?
核和值域的关系:什么是矩阵的秩? 这篇博客将介绍一个任意矩阵的核和值域的关系,并由此说明矩阵秩的意义、子空间维数、子空间正交。 1、矩阵的核:N(A) A ∈ C m n A\in C^{m\times n} A∈Cmn,矩阵的核,记…...

【MyBatis Plus】Service Mapper内置接口讲解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《MyBatis-Plus》。🎯🎯 &am…...

制作一个简单 的maven plugin
流程 首先, 你需要创建一个Maven项目,推荐用idea 创建项目 会自动配置插件 pom.xml文件中添加以下配置: <project> <!-- 项目的基本信息 --> <groupId>com.example</groupId> <artifactId>my-maven-plugi…...

基于linux系统的Tomcat+Mysql+Jdk环境搭建(三)centos7 安装Tomcat
Tomcat下载官网: Apache Tomcat - Which Version Do I Want? JDK下载官网: Java Downloads | Oracle 中国 如果不知道Tomcat的哪个版本应该对应哪个版本的JDK可以打开官网,点击Whitch Version 下滑,有低版本的,如…...
Ubuntu环境下SomeIP/CommonAPI环境搭建详细步骤
环境搭建 1.Boost安装 下载Boost源码 : https://www.boost.org/users/download/ 编译安装 首先安装编译所需依赖 sudo apt-get install build-essential g sudo apt-get install installpython-dev autotools-dev sudo apt-get install installlibicu-dev buil…...

maven 项目导入异常问题
问题如下 一、 tomcat正再运行的包是哪一个 不同构建、打包情况下分别运行 out\artifacts下 当直接去Project Structure下去构建artifacts 后,运行tomcat 则会在out下target下 reimport项目后,则会在artifacts自动生成部署包。删除tomcat之前deployment 下的包(同…...

在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装教程
在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装教程 VMware 虚拟机解锁 macOS 安装选项使用 macOS iso 系统镜像安装使用 OpenCore 做引导程序安装 在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装…...

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)
ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台,该平台同时构建了ToolLLM的一个开源训练指令集。,该项目是OpenBMB机构(面壁智能与清华NLP联合成立)旗下的一款产品,OpenBMB机构名下还同时拥有另外一款明星产…...
串口通信(5)-C#串口通信数据接收不完整解决方案
本文讲解C#串口通信数据接收不完整解决方案。 目录 一、概述 二、Modbus RTU介绍 三、解决思路 四、实例 一、概述 串口处理接收数据是串口程序编写的关键...
大数据分析岗是干什么的?
大数据分析岗主要负责从大规模数据集中提取、整理、分析和解释有关业务、市场或其他相关领域的信息的职位。 主要的职责和工作内容如下: 1. 数据收集和整理 收集各种数据源(包括结构化、非结构化和半结构化数据),并将其整理成可…...
hadoop运行jar遇到的一个报错
报错信息: 2023-12-19 14:28:25,893 INFO mapreduce.Job: Job job_1702967272525_0001 failed with state FAILED due to: Application application_1702967272525_0001 failed 2 times due to AM Container for appattempt_1702967272525_0001_000002 exited with…...

长短期记忆(LSTM)神经网络-多输入分类
目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分程序: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…...

开启创意之旅:免费、开源的噪波贴图(noise texture)生成网站——noisecreater.com详细介绍
在当今数字创意领域,噪波贴图(Noise Texture)是游戏渲染、游戏开发、美术设计以及影视制作等行业不可或缺的艺术素材之一。为了满足广大创作者的需求,noisecreater.com应运而生,成为一款免费、开源的噪波贴图生成工具。…...

Android Studio问题解决:Gradle Download 下载超时 Connect reset
文章目录 一、遇到问题二、解决办法 一、遇到问题 Gradle Download下载超时Sync了很多次,一直失败 二、解决办法 手动通过gradle网站下载 https://gradle.org/releases/可能也会出现超时,最好开个VPN软件会比较快。 下载好的软件,放到本机的…...
【Python百宝箱】云上翱翔:Python编程者的AWS奇妙之旅
雲端箴言:用Python主持AWS管理交響樂 前言 随着云计算的普及,AWS(Amazon Web Services)成为了许多组织和开发者首选的云服务提供商。作为Python工程师,深入了解AWS管理工具和库对于高效利用云资源至关重要。本文将引…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...