Java集成腾讯云音视频录制功能
为什么要实现音视频录制功能
因为我们做的是一个医院的项目,医生和患者可能进行视频通话和语音通话,为了保证通话的质量以及后续的问题,
我们就需要进行音视频录制,以便后续的问题解决
为什么选择使用腾讯云实现音视频录制功能
因为我们做的是微信小程序
- 腾讯云是基于腾讯的技术支撑,大厂技术比较稳定;
- 微信和腾讯云都是腾讯的产品,两者兼容性更好;
- 腾讯云提供的有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)]](https://i-blog.csdnimg.cn/blog_migrate/26e8291499d700567409081fe7fc81df.png)
2.1 添加配置文件
访问秘钥和key

SDKAppID和SDKSecretKey
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2EGXXrF-1680487013380)(C:\Users\11\AppData\Roaming\Typora\typora-user-images\image-20230401100744076.png)]](https://i-blog.csdnimg.cn/blog_migrate/cfa320d21c981d62f65b414562b684fe.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)]](https://i-blog.csdnimg.cn/blog_migrate/5e4e01470560b1f30b5c7ff2919d6822.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)]](https://i-blog.csdnimg.cn/blog_migrate/8d0f2a81b1a0c64a3ed89d65206dea8d.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)]](https://i-blog.csdnimg.cn/blog_migrate/b1ea6aa76e21e2dbc9aa05a83b6276c4.png)
代码实现
/**
* 开启腾讯云录制
* @param userId
* @param roomId
* @return
* @throws Exception
*/
private

最低0.47元/天 解锁文章
598





