- 在
pom.xml中导入依赖
<dependency>
<groupId>io.gitee.tamako520</groupId>
<artifactId>all-api</artifactId>
<version>1.3.0</version>
</dependency>
- 在
application.yml文件中添加配置
该处的配置并不需要全部填写,只需要按需填写即可,也就是说需要哪些功能就填那些参数,具体可以参考我的上一篇文章
volc-engine:
access-key-id: <accessKeyId>
secret-access-key: <secretAccessKey>
rtc:
app-id: <appId>
app-key: <appKey>
- 编写工具类
RTCUtil,具体需要什么都可以自己修改
@Slf4j
@Component
@RequiredArgsConstructor
public class RTCUtil {
private final VolcEngineRTCApi volcEngineRtcApi;
private final AliProperties aliProperties;
/**
* 获取 RTC 访问令牌
*
* @param userId 用户id
* @param roomId 房间id
* @return RTC 访问令牌
*/
public String accessToken(String userId, String roomId, long expireTimeSeconds) {
Map<PrivilegesEnum, DateTime> map = new HashMap<>();
map.put(PrivilegesEnum.PRIV_PUBLISH_STREAM, DateTime.now().offset(DateField.SECOND, (int) expireTimeSeconds));
map.put(PrivilegesEnum.PRIV_SUBSCRIBE_STREAM, DateTime.now().offset(DateField.SECOND, (int) expireTimeSeconds));
return volcEngineRtcApi.getAccessToken(userId, roomId, DateTime.now().offset(DateField.SECOND, (int) expireTimeSeconds), map);
}
/**
* 禁止用户音视频流
*
* @param roomId 房间id
* @param userId 用户id
* @param videoStatus 视频流状态
* @param audioStatus 音频流状态
* @param banTime 禁止时间
*/
public void banUserStream(String roomId, String userId, Boolean videoStatus, Boolean audioStatus, Long banTime) {
BanUserStreamDto dto = new BanUserStreamDto()
.setRoomId(roomId)
.setUserId(userId)
.setVideo(videoStatus)
.setAudio(audioStatus)
.setForbiddenInterval(banTime);
ResponseVo<BaseResult> vo = volcEngineRtcApi.banUserStream(dto);
checkError(vo);
}
/**
* 移出用户
*
* @param roomId 房间id
* @param userId 用户id
*/
@Async
public void kickUser(String roomId, String userId) {
KickUserDto dto = new KickUserDto().setRoomId(roomId).setUserId(userId);
ResponseVo<BaseResult> vo = volcEngineRtcApi.kickUser(dto);
checkError(vo);
}
/**
* 解散房间
*
* @param roomId 房间id
*/
public void dismissRoom(String roomId) {
ResponseVo<BaseResult> vo = volcEngineRtcApi.dismissRoom(roomId);
try {
checkError(vo);
} catch (CustomException e) {
if (!"not found room".equals(e.getMessage())) {
//房间不存在,忽略
log.error(e.getMessage());
}
}
}
/**
* 开始录制合并流
*
* @param roomId 房间id
*/
@Async
public void startRecordMergeStream(String roomId, String taskId) {
LocalDateTime now = LocalDateTime.now();
String randomNumbers = RandomUtil.randomNumbers(6);
String[] prefix = {"VolcEngineRTCRecord", now.format(DateTimeFormatter.ofPattern("yyyyMMdd"))};
//文件名格式:VolcEngineRTCRecord/2021-11-11/taskId_roomId_randomNumbers.mp4
//开始录制
CustomConfig customConfig = new CustomConfig()
.setVendor(1)
.setRegion(3)
.setBucket(aliProperties.getOss().getBucketName())
.setAccessKey(aliProperties.getAccessKeyId())
.setSecretKey(aliProperties.getAccessKeySecret());
StorageConfig storageConfig = new StorageConfig()
.setType(2)
.setCustomConfig(customConfig);
StartRecordMergeStreamDto dto = new StartRecordMergeStreamDto()
.setRoomId(roomId)
.setTaskId(taskId)
.setPrefix(prefix)
.setPattern("{TaskId}_{RoomId}_" + randomNumbers)
.setStorageConfig(storageConfig)
.setMaxIdleTime(300);
ResponseVo<String> stringResponseVo = volcEngineRtcApi.startRecordMergeStream(dto);
checkError(stringResponseVo);
log.info("开始录制房间{}的合并流,任务id:{}", roomId, taskId);
}
/**
* 停止录制合并流
*
* @param roomId 房间id
*/
public void stopRecord(String roomId,String taskId) {
StopRecordDto dto = new StopRecordDto()
.setRoomId(roomId)
.setTaskId(taskId);
ResponseVo<String> stringResponseVo = volcEngineRtcApi.stopRecord(dto);
checkError(stringResponseVo);
}
/**
* 获取用户实时列表
*
* @param roomId 房间id
* @return 用户实时列表
*/
public List<String> getRoomOnlineUsers(String roomId) {
ResponseVo<GetRoomOnlineUsersResult> roomOnlineUsers = volcEngineRtcApi.getRoomOnlineUsers(roomId);
ResponseVo.ErrorInfo error = roomOnlineUsers.getResponseMetadata().getError();
if (ObjUtil.isNotEmpty(error)) {
log.warn(error.getMessage());
}
GetRoomOnlineUsersResult result = roomOnlineUsers.getResult();
if (result.getRoomExists().equals(true)) {
return result.getVisibleUserList();
}
return new ArrayList<>();
}
/**
* 检查房间是否需要关闭
* 房间存在且无在线用户,则需要关闭房间
*
* @param roomId 房间id
* @return 是否需要关闭
*/
public Boolean checkRoomNeedClose(String roomId) {
ResponseVo<GetRoomOnlineUsersResult> roomOnlineUsers = volcEngineRtcApi.getRoomOnlineUsers(roomId);
ResponseVo.ErrorInfo error = roomOnlineUsers.getResponseMetadata().getError();
if (ObjUtil.isNotEmpty(error)) {
log.warn(error.getMessage());
}
GetRoomOnlineUsersResult result = roomOnlineUsers.getResult();
// 需要删除
// log.info("房间{},状态:{}, 在线人数:{}", roomId, result.getRoomExists(), result.getVisibleUserList() == null ? 0 : result.getVisibleUserList().size());
//房间存在且无在线用户
return result.getRoomExists().equals(true) && CollUtil.isEmpty(result.getVisibleUserList());
}
/**
* 判断用户是否在当前房间中
*
* @param roomId 房间id
* @param userId 用户id
* @return 是否在房间中 true:在房间中 false:不在房间中
*/
public Boolean checkUserInRoom(String roomId, String userId) {
List<String> roomOnlineUsers = getRoomOnlineUsers(roomId);
return roomOnlineUsers.contains(userId);
}
/**
* 检查错误
*
* @param stringResponseVo 响应结果
* @param <T> 响应类型
*/
private static <T> void checkError(ResponseVo<T> stringResponseVo) {
ResponseVo.ErrorInfo error = stringResponseVo.getResponseMetadata().getError();
if (ObjUtil.isNotEmpty(error) && !error.getMessage().contains("not found user")) {
throw new CustomException(error.getMessage());
}
}
}

808

被折叠的 条评论
为什么被折叠?



