SOP TRTC SDK 仪表盘 Android TRTC 发送自定义采集的视频数据 Android TRTC 发送自定义采集音频解决方案 Android TRTC 实现横屏视频通话 iOS端 TRTC 发送自定义采集视频解决方案 iOS端 TRTC 发送自定义采集音频解决方案 APNS推送 脏字过滤 TXLiteAVSDK中使用 AVAudioSession 问题总结 AndroidStudio编译SDK报错 RoomService部署验证 Xcode编译SDK报错 iOS编译库冲突问题 iOS端移动直播自定义采集实现 iOS端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端LiteIM sdk升级IM4.x版本报错问题 移动直播iOS 12兼容问题 如何实现好的画质 如何计算PCM音量大小 使用播放器播放视频有黑边 直播拉流播放失败 直播拉流端卡顿现象 短视频上传失败 移动直播SDK对接第三方美颜库 移动直播连麦解决方案 Android移动直播推自定义采集的视频数据 Android移动直播推自定义采集的声音数据 Android直播播放如何获取YUV数据 Android直播播放如何自定义渲染 实时音视频画面黑屏 实时音视频订阅流显示 iOS 12默认新编译系统下文件名冲突问题 TXLiteAVSDK指标监控 进阶:小程序实时音视频参数透传 移动直播 Android 9.0 无法拉流问题 移动直播推流事件回调 移动直播拉流事件回调 短视频实现视频缩略图列表转GIF功能 roomService加入群组时报错invalid group id NTP时间戳转换 提示Role not exists 角色不存在 如何播放背景音乐 iOS端短视频添音频相关问题总结 Web同步终端离线推送TIMOfflinePushInfo说明文档 web端自定义消息发送 web端同步终端的已读回执 web端对群组内用户禁言操作 TRTC v2混流接口setMixTranscodingConfig使用指引

进入av房间,提示Role not exists 角色不存在(确认角色已配置)

发布日期:2019年1月9日 更新日期:2019年1月9日 贡献者:yjjjiang

背景

iLiveSDK 1.9.5版本引入了进房角色不存在时直接报错的机制。但是在确认角色已配置的情况下,仍有概率出现进房出现角色不存在情况。

为什么会失败

这里简单介绍一下SDK这一块的工作原理:

  1. 登录SDK时从服务器拉取角色配置表并缓存本地

  2. 进房时从配置表中查找角色

从上面的流程可以看到,如果在登录时拉取角色配置失败,将会导致无法进房.

拉取角色配置地址

http://conf.voice.qcloud.com/index.php?sdk_appid=[SDKAPPID]&interface=Voice_Conf_Download&platform=[平台] [SDKAPPID] 对应用户的应用标识 [平台] 对应终端平台, 0(pc/web), 1(ios), 2(android), 4(mac) 示例:

http://conf.voice.qcloud.com/index.php?sdk_appid=1400028285&interface=Voice_Conf_Download&platform=1 对于拉取配置失败时,用户可以尝试使用浏览器访问上面地址,排查下网络故障

如何解决这个问题

这里推荐的有两种方式可以避免这个问题:

  1. 重试 即在进房失败时,判断若失败原因是角色不存在,可以尝试直接重新登录(重新拉取角色配置)

  2. 设置默认配置 登录接口中已支持设置默认角色配置(拉取失败时会使用默认角色配置)

登录接口参数:

参数名 类型 描述
id String 用户标识
userSig String 用户签名
spearCfg String 默认角色配置
loginCallBack ILiveCallBack 登录回调

这里的spearCfg即可用设置默认角色配置

我们可以通过上面的拉取角色配置地址查看当前的配置,并在其中选取一个角色作为默认配置:

以下操作说明,均以sdkappid = 1400049564 为例;

实际操作时,以业务申请的sdkappid替换

Spear配置下载

  1. 拼spear配置地址: http://conf.voice.qcloud.com/index.php?sdk_appid=1400049564&interface=Voice_Conf_Download&platform=1 (实际操作时,注意修改 url 中 sdk_appidplatform (0(pc/web), 1(ios), 2(android), 4(mac))的值,

  2. iOS配置下载 : http://conf.voice.qcloud.com/index.php?sdk_appid=1400049564&interface=Voice_Conf_Download&platform=1

  3. Android配置下载 : http://conf.voice.qcloud.com/index.php?sdk_appid=1400049564&interface=Voice_Conf_Download&platform=2
  4. pc配置下载:http://conf.voice.qcloud.com/index.php?sdk_appid=1400049564&interface=Voice_Conf_Download&platform=0

  5. 拿第一步地址到浏览器中访问,即可拿到json字符串,将json串文本拷入文件 1400049564.json , 文件名无要求,将此文件作为资源文件打包到App;

备注: 如果Spear更新了,App想动态去同步,业务层可以自行在app内去请求第一步的地址,并保存文件,如需要再该逻辑再详述这里;

iLivesdk参考文档

手机端进房失败(Role no exists)
Windows进房失败(Role no exists)

QAVSDK的操作配置下载以及代码示例

前展开第一步存储的文件内容: data["conf"] 即为角色列表

{
    "data":{
        "biz_id":1400049564,
        "conf":[
            {
                "audio":{
                    "aec":1,
                    "agc":0,
                    "ans":1,
                    "anti_dropout":0,
                    "au_scheme":1,
                    "channel":2,
                    "codec_prof":4106,
                    "frame":40,
                    "kbps":24,
                    "max_antishake_max":1000,
                    "max_antishake_min":400,
                    "min_antishake":120,
                    "sample_rate":48000,
                    "silence_detect":0
                },
                "is_default":1,
                "net":{
                    "rc_anti_dropout":1,
                    "rc_init_delay":100,
                    "rc_max_delay":500
                },
                "role":"LiveMaster",
                "type":1,
                "video":{
                    "anti_dropout":0,
                    "codec_prof":5,
                    "format":-2,
                    "format_fix_height":480,
                    "format_fix_width":640,
                    "format_max_height":-1,
                    "format_max_width":-1,
                    "fps":15,
                    "fqueue_time":-1,
                    "live_adapt":0,
                    "maxkbps":400,
                    "maxqp":-1,
                    "minkbps":400,
                    "minqp":-1,
                    "qclear":1,
                    "small_video_upload":0
                }
            },
            {
                "audio":{
                    "aec":1,
                    "agc":0,
                    "ans":1,
                    "anti_dropout":0,
                    "au_scheme":1,
                    "channel":2,
                    "codec_prof":4106,
                    "frame":40,
                    "kbps":24,
                    "max_antishake_max":1000,
                    "max_antishake_min":400,
                    "min_antishake":120,
                    "sample_rate":48000,
                    "silence_detect":0
                },
                "is_default":0,
                "net":{
                    "rc_anti_dropout":1,
                    "rc_init_delay":500,
                    "rc_max_delay":1000
                },
                "role":"Guest",
                "type":2,
                "video":{
                    "anti_dropout":0,
                    "codec_prof":5,
                    "format":-2,
                    "format_fix_height":480,
                    "format_fix_width":640,
                    "format_max_height":-1,
                    "format_max_width":-1,
                    "fps":15,
                    "fqueue_time":-1,
                    "live_adapt":0,
                    "maxkbps":400,
                    "maxqp":-1,
                    "minkbps":400,
                    "minqp":-1,
                    "qclear":1,
                    "small_video_upload":0
                }
            },
            {
                "audio":{
                    "aec":1,
                    "agc":0,
                    "ans":1,
                    "anti_dropout":0,
                    "au_scheme":1,
                    "channel":2,
                    "codec_prof":4106,
                    "frame":40,
                    "kbps":24,
                    "max_antishake_max":1000,
                    "max_antishake_min":400,
                    "min_antishake":120,
                    "sample_rate":48000,
                    "silence_detect":0
                },
                "is_default":0,
                "net":{
                    "rc_anti_dropout":1,
                    "rc_init_delay":100,
                    "rc_max_delay":500
                },
                "role":"LiveGuest",
                "type":3,
                "video":{
                    "anti_dropout":0,
                    "codec_prof":5,
                    "format":-2,
                    "format_fix_height":480,
                    "format_fix_width":640,
                    "format_max_height":-1,
                    "format_max_width":-1,
                    "fps":15,
                    "fqueue_time":-1,
                    "live_adapt":0,
                    "maxkbps":400,
                    "maxqp":-1,
                    "minkbps":400,
                    "minqp":-1,
                    "qclear":1,
                    "small_video_upload":0
                }
            }
        ],
        "platform":1,
        "scheme":1,
        "sequence":20
    },
    "errmsg":"success.",
    "retcode":0
}

iOS

  1. 要使用自定义配置作为sdk配置,需要在QAVContext start时时指定QAVContextStartParam使用 QAVCustomSpearEngineCtrl
QAVContextStartParam *startParam = [[QAVContextStartParam alloc] init];
            startParam.sdkAppId = appIdInt;
            startParam.appidAt3rd = appIdStr;
            startParam.accountType = accountType;
            startParam.identifier = uid;

            // 主要是这一步
            startParam.engineCtrlType = QAVSpearEngineCtrlTypeCustom;

            QAVContext *avContext = [QAVSDK CreateContext];
            [avContext startWithParam: startParam completion:^(int result, NSString *errorInfo) {
                if(result == 0)
                {
                    // TODO: 开始设置avContext.customSpearCtrl
                }
            }]
  1. 开始设置customSpearCtrl

// 1: 互动直播 
[avContext.customSpearCtrl setScene:1];

// 以下添加为伪代码

NSDictionary *spearjson = loadFromResourceFile(); // 从加载第一步spear文件内容
NSDictionary *data =  spearjson[@"data"];
NSArray *conf =  data[@"conf"];
for (NSDictionary *confitem in conf)
{
    NSString *role = confitem[@"role"];
    avContext.customSpearCtrl addParamByRole:role jsonParam: confitem.tojsonstring];
}

Android

  1. 要使用自定义配置作为sdk配置,需要在QAVContext start时时指定QAVContextStartParam使用 QAVCustomSpearEngineCtrl

AVContext.StartParam param = new AVContext.StartParam();
param.sdkAppId = mUserInfo.sdkAppId;
param.accountType = "" + mUserInfo.accountType;
param.appIdAt3rd = "" + mUserInfo.sdkAppId;
param.identifier = mUserInfo.identifier;
param.useSurfaceTexture = ILiveSDK.getInstance().isUseSurfaceTexture();

// 主要是这一步
param.engineCtrlType = AVSpearEngineCtrl.SPEAR_ENGINE_CTRL_TYPE_CUSTOM;
mAVContext.start(param, new AVCallback(){
    @Override
    public void onComplete(int errCode, String errInfo) {
        if(errCode == 0)
        {
            // TODO: 开始设置mAVContext.getCustomSpearEngineCtrl()
        }
    }
});
  1. 开始设置customSpearCtrl
// 1: 互动直播
mAVContext.getCustomSpearEngineCtrl().setScene(1);

// 以下添加为伪代码
try {
    JSONObject jsonConfig = loadFromResourceFile();  // 从加载第一步spear文件内容
    JSONObject jsonData = jsonConfig.getJSONObject("data");
    JSONArray jsonConf = jsonData.getJSONArray("conf");
    for (int i=0; i<jsonConf.length(); i++){
        JSONObject jsonRole = jsonConf.getJSONObject(i);
        mAVContext.getCustomSpearEngineCtrl().addParamByRole(jsonRole.getString("role"), jsonRole.toString());
    }
}catch (Exception e){
    // 处理异常
}

results matching ""

    No results matching ""