springboot接入火山引擎rtc

  1. pom.xml中导入依赖
<dependency>
    <groupId>io.gitee.tamako520</groupId>
    <artifactId>all-api</artifactId>
    <version>1.3.0</version>
</dependency>
  1. application.yml文件中添加配置

该处的配置并不需要全部填写,只需要按需填写即可,也就是说需要哪些功能就填那些参数,具体可以参考我的上一篇文章

volc-engine:
  access-key-id: <accessKeyId>
  secret-access-key: <secretAccessKey>
  rtc:
    app-id: <appId>
    app-key: <appKey>
  1. 编写工具类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());
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v_wus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值