【最佳实践】巡检项:实时音视频 (TRTC) 原生平台 SDK 退房逻辑是否正确

2023-04-23 11:46:43 浏览数 (1)

问题/风险描述:

用户新进入A房间推流,过一段时间之后,用户退出A房间,然后进入B房,出现了预览画面黑屏现象,从仪表盘看没有视频推流数据。本地日志显示用户确实先从A房间退出(exitRoom A),然后再进入B房间(enterRoom B),同时日志有报glError 1282错误。

参考日志参考日志

安卓端报glError 1282错误通常是glContext环境切换异常导致,进一步排查日志发现,用户在退房后,没有等待onExitRoom事件回调,而是在exitRoom之后就调用enterRoom进入了另一个房间。

代码语言:javascript复制
//参考代码
mTRTCParams = new TRTCCloudDef.TRTCParams();
mTRTCParams.sdkAppId = GenerateTestUserSig.SDKAPPID;
mTRTCParams.userId = mUserId;
mTRTCParams.roomId = Integer.parseInt(mRoomId);
mTRTCParams.userSig = GenerateTestUserSig.genTestUserSig(mTRTCParams.userId);
mTRTCParams.role =TRTCCloudDef.TRTCRoleAudience;
// 退出房间
mTRTCCloud.exitRoom();
// 进入房间
mTRTCCloud.enterRoom(mTRTCParams, TRTC_APP_SCENE_LIVE);

根据TRTC SDK的规范,退出房间会释放相关的资源,状态会重置,但这个过程是异步的。在触发 onExitRoom回调之前,相关的操作会在SDK线程执行,执行完毕后才会触发onExitRoom。

因为用户在退房过程中,没有等待相关的状态重置完毕,就再次进入另外一个房间,导致SDK内部状态混乱,报错glContext 切换异常。

解决方案:

通过上面分析知道,该问题的原因是因为进房(enterRoom)的时机不对,解决办法是在执行再次进入新的房间操作时候,需要等待前一个退房操作完成;

改进步骤只需要把进入房间的相关代码,移动到onExitRoom的事件回调里面执行。

代码语言:javascript复制
//参考代码
boolean dontEnterRoom = false;
@Override
public void onExitRoom(int code) {
    // 退出前一个房间的事件
    if(code>=0 && !dontEnterRoom) {
        mTRTCParams = new TRTCCloudDef.TRTCParams();
        mTRTCParams.sdkAppId = GenerateTestUserSig.SDKAPPID;
        mTRTCParams.userId = mUserId;
        mTRTCParams.roomId = Integer.parseInt("2222");
        mTRTCParams.userSig = GenerateTestUserSig.genTestUserSig(mTRTCParams.userId);
        mTRTCParams.role = TRTCCloudDef.TRTCRoleAnchor;
        mTRTCCloud.enterRoom(mTRTCParams, TRTC_APP_SCENE_LIVE);
        dontEnterRoom = true;
    }
}

注意事项:

在进入房间(enterRoom)和退出房间(exitRoom)SDK都会在SDK线程执行一些耗时操作,从而避免UI因此卡住,所以需要等待各自操作完成的事件回调,才可以继续执行相关操作。另外,如果只是进入另外的房间,推荐使用switchRoom接口。

0 人点赞