Java对接腾讯多人音视频房间回调接口示例

news2024/11/24 20:45:55

在前面我们已经对接好了腾讯多人音视频房间相关内容: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;

    @Autowired
    TxCallbackService txCallbackService;

    @Autowired
    CallbackListenerStrategyContext callbackListenerStrategyContext;

//    // 实例参数
//    {
//        "address": "https://www.sakura.com/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 {

    @Autowired
    RoomctlUtil roomctlUtil;

    /**
     * @Description: 配置回调
     * @Author: Sakura
     * @Date: 2023/12/18 17:46
     */
    @Override
    @Transactional
    public Result createCallback(CreateCallbackRequest createCallbackRequest) {
        String result = roomctlUtil.createCallback(createCallbackRequest.getAddress(), createCallbackRequest.getActions());
        if (!"ok".equals(result)) {
            return Result.ERROR(result);
        }

        return Result.SUCCESS();
    }

    @Override
    @Transactional
    public 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 implements Serializable {

    private static final long serialVersionUID = 1L;

    // 回调的地址,需要以 http/https 开头,建议使用更为安全的 https
    private 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<>();

    @Resource
    CallbackListenerService callbackListenerService;

    @PostConstruct
    @SneakyThrows
    public 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;

    // 异常消息
    private 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可以照着写

这样就能收到回调信息了

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

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

相关文章

机器学习 | 集成学习

团结就是力量&#xff01; Ensemble Learning 兼听则明&#xff0c;偏信则暗。 集成学习既是一种思想也是一类算法&#xff0c;它是建立在其他机器学习的算法之上&#xff0c;研究怎么让不同的算法之间进行协同。 既可以监督学习&#xff0c;也可以无监督学习。 集成学习用机器…

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL&#xff1a;多线程、大并发和异步操作的实践 在前面的文章中&#xff0c;我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而&#xff0c;在实际应用中&#xff0c;特别是面对大量用户请求和高并发场景时&#xff0c;单线程的数据库操作往往显得力不从…

降本不增“笑”的正确打开方式

引言: 在当前行业形势下&#xff0c;降本增效已经是公认的命题&#xff0c;粗放扩张的时代已经过去&#xff0c;接下来是在从业务到技术都需要精细化管理的时代。但在这个命题下&#xff0c;往往未被提及的一点是用户价值。如果为了降本增效&#xff0c;而牺牲了用户价值&…

GeoTrust SSL证书详细介绍

GeoTrust是著名的证书颁发CA机构DigiCert的品牌。GeoTrustSSL产品在Internet上提供从基本域名验证到扩展验证SSL标准支持的最高级验证的安全性。 GeoTrust OV&#xff08;组织验证&#xff09;证书验证域所有权和组织的存在。在颁发证书之前&#xff0c;会检查该组织在公共数据…

Linux学习(2)——基本命令

目录 1、pwd&#xff08;print work directory&#xff09;: 显示当前路径 2、cd&#xff08;change directory&#xff09; &#xff1a;切换目录 2.1路径的分类 2.1.1 绝对路径&#xff1a;以 根&#xff08;/&#xff09; 开头的路径 2.1.2 相对路径&#xff1a;…

CVE-2023-33246 RocketMQ RCE漏洞

一、RocketMQ简介 RocketMQ是一款纯java、分布式、队列模型的开源消息中间件&#xff0c;主要用于在分布式系统中进行异步消息传递&#xff0c;支持事务消息、顺序消息、批量消息、定时消息、消息回溯等功能。 RocketMQ有四个核心组成部分&#xff1a; NameServer&#xff1…

【UML】第8篇 用例图(3/3)

目录 一、用例的关系 1.1 泛化&#xff08;Generalization&#xff09;关系 1.2 包含&#xff08;include&#xff09;关系 1.3 扩展关系 二、用例表示例 不是非要把电影改成连续剧&#xff0c;给大家播&#xff0c;确实是时间和精力有限。 用例图&#xff0c;虽然简单&…

【Python/网络安全】 Git漏洞之Githack工具基本安装及使用详析

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析 前言安装步骤工具使用实战总结 前言 Git是一个非常流行的开源分布式版本控制系统&#xff0c;它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统&#xff0c;并将其部署到生产环境中…

Stable-diffusion-webui本地部署和简要介绍

Stable Diffusion 是一款基于人工智能技术开发的绘画软件&#xff0c;它可以帮助艺术家和设计师快速创建高品质的数字艺术作品。是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;同时也可以应用于其他任务&#xff0c;如内补绘制、…

WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!

点我下载&#xff0c;仅供个人学习使用 参考easyvision开发&#xff0c;集成几十个软件算子此版本以添加ui设计器。具体功能如上所示&#xff0c;可以自定义变量&#xff0c;写c#脚本&#xff0c;自定义流程&#xff0c;包含了halcon脚本和封装的算子&#xff0c;可自定义ui&a…

交叉熵损失(Cross-Entropy loss)

在处理机器学习或深度学习问题时&#xff0c;损失/成本函数用于在训练期间优化模型。目标几乎总是最小化损失函数。损失越低&#xff0c;模型越好。交叉熵损失是最重要的成本函数。它用于优化分类。对交叉熵的理解取决于对 Softmax 激活函数的理解。 一、softmax激活函数 激活…

手机上怎么合成gif?手机图片合成gif分享

手机上的功能越来越丰富&#xff0c;很多电脑上能制作的东西手机上也能制作。那么当我们想要在手机上制作gif动画的时候要怎么操作呢&#xff1f;非常的简单&#xff0c;使用在线制作动画gif&#xff08;https://www.gif.cn/&#xff09;网站-GIF中文网&#xff0c;手机自带浏览…

分析某款go扫描器之四

一、概述 上文提到实现IP的探测存活以及tcp扫描的实现&#xff0c;这部分来分析实现本机网卡信息获取&#xff0c;以及维护一张mac地址表以及ip扫描端口状态表&#xff0c;同时实现syn扫描功能。 项目来源&#xff1a;https://github.com/XinRoom/go-portScan/blob/main/util…

K8S(十一)—Service详解

目录 Service发布服务&#xff08;服务类型&#xff09;type: ClusterIP选择自己的 IP 地址例子 type: NodePort选择你自己的端口为 type: NodePort 服务自定义 IP 地址配置例子 type: LoadBalancer混合协议类型的负载均衡器禁用负载均衡器节点端口分配设置负载均衡器实现的类别…

互动破千万!冰雪营销两大玩法,小红书数据分析!

2022年冬奥会带火了冰雪运动&#xff0c;到如今“冰雪热”仍在持续。通过千瓜数据&#xff0c;查看小红书平台“冰雪”这一关键词的数据&#xff0c;近30天互动总量超过1300万&#xff0c;官方连续发布的几场活动&#xff0c;皆与冰雪相关&#xff0c;#东北精神上的快乐老家 #追…

js中async和await高级用法

文章目录 一、介绍二、async/await与高阶函数三、控制并发数四、使用async/await优化递归五、异步初始化类实例六、在async函数中使用await链式调用七、结合async/await和事件循环八、使用async/await简化错误处理九、最后 一、介绍 JavaScript的异步编程已经从回调(callback)…

Vue前端设计模式

文章目录 一、什么是设计模式&#xff1f;二、设计几个原则三、常见的设计模式及实际案例3.1、单例模式3.1.1、Element UI3.1.2、Vuex 3.2、工厂模式3.2.1、VNode3.2.2、vue-route 3.3、策略模式3.3.1、表格 formatter3.3.2、表单验证 3.4、代理模式3.4.1、拦截器3.4.2、前端框…

考研小白助力宝典(2)

前言 考研&#xff0c;是一场耗时长久的脑力之战&#xff0c;刻苦勤奋的态度和披荆斩棘的精神外&#xff0c;往往取决于谁抓好了信息利剑&#xff01;合理得当利用好信息平台&#xff0c;就已经快人一步战胜了大部分的竞争对手了&#xff01; 目录 着重学习练习 考研相关简介 …

vscode开发python环境配置

前言 vscode作为一款好用的轻量级代码编辑器&#xff0c;不仅支持代码调试&#xff0c;而且还有丰富的插件库&#xff0c;可以说是免费好用&#xff0c;对于初学者来说用来写写python是再合适不过了。下面就推荐几款个人觉得还不错的插件&#xff0c;希望可以帮助大家更好地写…