Java集成腾讯云音视频录制功能

Java集成腾讯云音视频录制功能

为什么要实现音视频录制功能

因为我们做的是一个医院的项目,医生和患者可能进行视频通话和语音通话,为了保证通话的质量以及后续的问题,

我们就需要进行音视频录制,以便后续的问题解决

为什么选择使用腾讯云实现音视频录制功能

因为我们做的是微信小程序

  1. 腾讯云是基于腾讯的技术支撑,大厂技术比较稳定;
  2. 微信和腾讯云都是腾讯的产品,两者兼容性更好;
  3. 腾讯云提供的有uni-app的例子,参考资料更充分,可以基于demo和现有系统集成。

注意:userId需要保持在整个房间是唯一的,不管是录制还是音视频通话,进入房间的userId必须唯一,不然就会造成录制不了的情况

1.导入依赖

因为我们是Gradle项目,与我们之前Maven项目导入依赖的方式不一样,Gradle项目导入依赖的方式如下所示

implementation 'com.tencentcloudapi:tencentcloud-sdk-java-common:3.1.691'
implementation 'com.tencentcloudapi:tencentcloud-sdk-java-trtc:3.1.691'
implementation 'com.tencentcloudapi:tencentcloud-sdk-java-vod:3.1.704'

2.实现云端录制

流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaUQaOLH-1680487013379)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230403092937476.png)]

2.1 添加配置文件

访问秘钥和key
在这里插入图片描述

SDKAppID和SDKSecretKey

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2EGXXrF-1680487013380)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230401100744076.png)]

在application.properties添加一下配置

secretid=访问秘钥ID
secretkey=访问秘钥Key
expiretime=过期时间
sdkappid=SDKAppID
key=SDKSecretKey
2.2 回调地址设置

打开音视频控制台 --》应用管理 --》回调配置

跟着下面配置就可以了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VC5U95iR-1680487013381)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230401121640938.png)]

2.3 签名 Sign
/**
 * @param key 回调秘钥
 * @param body 入参
 * @return 签名 Sign 计算公式中 key 为计算签名 Sign 用的加密密钥。
 * @throws Exception
 */
private static String getResultSign(String key, String body) throws Exception {
   
   
    Mac hmacSha256 = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
    hmacSha256.init(secret_key);
    return Base64.getEncoder().encodeToString(hmacSha256.doFinal(body.getBytes()));
}
2.4 实现房间回调

房间回调API文档地址:https://cloud.tencent.com/document/product/647/51586

使用房间回调事件可以监听进入房间和退出房间时间,分别对应开始录制和退出录制(当我们进入房间开始录制,退出房间就退出录制)

入参是body加上请求头的方式,详细信息大家可以查阅文档,这里我就不一一赘述了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCLNAmjP-1680487013381)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230401095115187.png)]

代码实现

//# 功能:第三方回调sign校验
    //# 参数:
    //# key:控制台配置的密钥key
    //# body:腾讯云回调返回的body体
    //#  sign:腾讯云回调返回的签名值sign
    //# 返回值:
    //#  Status:OK 表示校验通过,FAIL 表示校验失败,具体原因参考Info
    //#  Info:成功/失败信息
    @ApiOperation(value = "音视频房间回调接口")
    @PostMapping("/roomCallback")
    public void roomCallback(@RequestBody String body, HttpServletRequest request) throws Exception {
   
   
        String key = "key"; 
        String sdkAppId = request.getHeader("SdkAppId");
        String sign = request.getHeader("Sign");
        String resultSign = getResultSign(key,body);
        ValueOperations ops = redisTemplate.opsForValue();
        if (resultSign.equals(sign)) {
   
   
            JSONObject jsonObject = (JSONObject) JSON.parse(body);
            Integer eventType = jsonObject.getInteger("EventType"); // 事件类型
            String eventInfo = jsonObject.getString("EventInfo"); // 事件信息
            JSONObject jsonObject1 = (JSONObject) JSON.parse(eventInfo);
            String roomId = jsonObject1.getString("RoomId"); // 房间号
            String userId = jsonObject1.getString("UserId"); // 用户ID
            if (!StringUtils.isEmpty(userId)) {
   
   
                // 执行业务逻辑,判断是医生端还是患者端进入房间,查询出相关的问诊订单
            }
            // 创建房间事件(创建房间事件只会进入一次房间回调接口,可以防止重复两次调用录制接口)
            if (eventType == 101) {
   
    
                logger.debug("{'Status': 'OK', 'Info': '校验通过'}");
                String openCloudRecording = openCloudRecording(userId, roomId); // 开启录制
                JSONObject jsonObject2 = (JSONObject) JSON.parse(openCloudRecording);
                    String taskId = jsonObject2.getString("taskId"); // 任务ID
                if (!StringUtils.isEmpty(taskId)) {
   
   
                    // 执行相关业务
                }
            } else if (eventType == 104) {
   
    // 104 退出房间事件
                logger.debug("{'Status': 'FAIL', 'Info': '退出房间'}");
                closeDeleteCloudRecording("录制任务ID"); // 退出录制
            }
        } else {
   
   
            logger.debug("{'Status': 'FAIL', 'Info': '校验失败'}");
        }
        logger.debug("腾讯云测试成功");
    }
2.5 开启音视频录制

开启云端录制API文档地址:https://cloud.tencent.com/document/api/647/73786

当房间回调事件监听到进入房间事件我们就开启语音(视频)通话了,就会调用开启音视频录制接口

输入参数我就不做赘述了(输出参数开启云端录制和关闭云端录制都是一致的),详细信息请看API文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SIXel2V-1680487013381)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230401103201717.png)]

代码实现

/**
     * 开启腾讯云录制
     * @param userId
     * @param roomId
     * @return
     * @throws Exception
     */
    private 
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值