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;

    @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可以照着写

这样就能收到回调信息了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 英特尔On技术创新大会直播 | AI魅力的生活化

目录 前言正文 前言 依稀记得去年的直播大会&#xff0c;主要展现了其灵活、加速和半集成化的独特优势&#xff0c;广泛应用于人工智能、5G通信、边缘计算以及视觉图像处理等领域&#xff0c;不断提供领先的性能、能效和可编程性的创新。 如今又带来一些不一样的特色&#xf…

使用@jiaminghi/data-view实现一个数据大屏

<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…

The Foundry NUKE 15 for mac/win:引领影视后期特效制作的创新力量

The Foundry NUKE 15 是一款领先的影视后期特效制作软件&#xff0c;为专业的视觉特效师和影视制作人员提供了强大的工具和功能。作为最新版本&#xff0c;NUKE 15不仅继承了之前版本的优点&#xff0c;更加强了其在创新和效率方面的能力&#xff0c;成为影视行业不可或缺的工具…

FLASH闪存的读取、擦除、编程(stm32f103c8t6)

一、stm32寄存器地址介绍 二、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口可以对程序存储器和选项字节进行擦除和编程 &#xff08;2&#xff09; 读写FLASH的用途&#xff1a;利用程…

Excel排序怎么做?记好这些正确操作!

“我是个职场新手&#xff0c;对excel的使用还不是很熟悉。但是我需要处理一份文件。有朋友可以简单介绍一下excel排序的操作方法吗&#xff1f;” Excel作为一个实用的办公工具&#xff0c;给用户带来了很多的方便。在使用excel时&#xff0c;排序功能是比较重要且常用的。我们…

宕机后,Redis如何实现快速恢复?

Redis作为非常火热的内存数据库&#xff0c;其除了具有非常高的性能之外&#xff0c;还需要保证高可用&#xff0c;在故障发生时&#xff0c;尽可能地降低故障带来的影响&#xff0c;Redis也提供了完善的故障恢复机制&#xff1a;哨兵。 下面就来具体来看看Redis的故障恢复是如…

声音克隆定制丰富和的系统源码+完整的代码包+搭建教程

随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经逐渐渗透到我们生活的各个领域。声音克隆技术&#xff0c;作为AI领域的一个重要分支&#xff0c;通过模仿人类的声音特征&#xff0c;生成与目标声音相似的语音。这项技术在语音合成、语音识别、虚拟现实…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function)&#xff0c;是衡量模型好坏的标准&#xff0c;用于估量模型的预测值与真实值的不一致程度&#xff0c;是一个…

深入剖析jsonp跨域原理

在项目中遇到一个jsonp跨域的问题&#xff0c;于是仔细的研究了一番jsonp跨域的原理。搞明白了一些以前不是很懂的地方&#xff0c;比如&#xff1a; 1&#xff09;jsonp跨域只能是get请求&#xff0c;而不能是post请求&#xff1b; 2&#xff09;jsonp跨域的原理到底是什么&…

这是最简单的轮播图,图片自己加

代码&#xff1a; <!DOCTYPE html> <html> <head> <title>轮播图</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } .container { position: relative; overflow: hid…

Golang 的内存管理

文章目录 1.内存管理角色1.常见的内存分配方法线性分配器空闲链表分配器TCMalloc 2.Go 内存管理组件mspanmcache初始化替换微分配器 mcentralmheap 3.内存分配4.内存管理思想参考文献 1.内存管理角色 内存管理一般包含三个不同的组件&#xff0c;分别是用户程序&#xff08;Mu…

Nginx快速入门:负载均衡upstream配置详解(四)

0. 引言 我们在第二章的时候简单演示了关于nginx实现负载均衡的演示&#xff0c;而实际上nginx支持很多负载均衡算法&#xff0c;并且多节点的转发也有多种策略。今天我们继续深入学习这块。 1. 负载均衡的应用场景 所谓负载均衡&#xff0c;Load Balance &#xff0c;就是将…

Jmeter自定义用户变量模拟多用户

java1234,56a801e9c869452fa092c9657cfc2051 jack,b6e528cca41143dea9c2c3e9ca5d6390

Linux环境安装Hadoop

&#xff08;1&#xff09;下载Hadoop安装包并上传 下载Hadoop安装包到本地&#xff0c;并导入到Linux服务器的/opt/software路径下 &#xff08;2&#xff09;解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

基于SpringBoot的教学管理app的开发-计算机毕业设计源码65449

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对教学管理等问题&#xff0c;对其进行研究分…

如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发

目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架&#xff0c;…

电气 接近开关

npn&#xff1a;和负载&#xff08;控制器或者继电器&#xff09;共阳极&#xff0c;低电平响应 pnp&#xff1a;和负载共阴极&#xff0c;高电平响应

MyBatisX生成时的选项的含义

一般&#xff0c;annotation和template勾选MyBatis-Plus 3 options中各选项的作用 comment&#xff1a;实体类各属性的注释&#xff08;数据库中有的话&#xff09;以及生成TableId注解&#xff0c;同时会给serialVersionUID属性加上TableField(exist false) toString/hashCo…

OpenSergo使用详解

简介 OpenSergo是一个基于微服务治理的标准和生态&#xff0c;覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域&#xff0c;覆盖了完整的微服务生命周期&#xff08;从开发态到测试态&#xff0c;到发布态&#xff0c;再到运…

不用翻箱倒柜找数据线,电脑投屏到另一台电脑,无线、远程投屏方法!

对于职场人士来说&#xff0c;电脑投屏电脑绝对是必不可少的工具&#xff0c;稳定高效的投屏开会是职场人渴望的技能&#xff0c;总比天天抱着笔记本走来走去&#xff0c;还要去翻箱倒柜的找数据线要强。如何实现电脑间的稳定投屏&#xff0c;AirDroid Cast提供了一个好思路。 …