用户新进入A房间推流,过一段时间之后,用户退出A房间,然后进入B房,出现了预览画面黑屏现象,从仪表盘看没有视频推流数据。本地日志显示用户确实先从A房间退出(exitRoom A),然后再进入B房间(enterRoom B),同时日志有报glError 1282错误。
安卓端报glError 1282错误通常是glContext环境切换异常导致,进一步排查日志发现,用户在退房后,没有等待onExitRoom事件回调,而是在exitRoom之后就调用enterRoom进入了另一个房间。
//参考代码
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的事件回调里面执行。
//参考代码
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接口。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有