unity renderstreaming 打包后通过导入json文件启动连接时报ArgumentException: Could not instantiate RTCPeerConnection

1.解决方式

如果信令服务器连接正常,但web端连接时报此错误,那可能是这种方式解决(之前那种方式为IceServerUrls添加true,本来想尽量少动源码,但那个导致了无法加载json的bug,因此改为下面这种)

如图,修改CommandLineParser类中的TryParseStringArrayArgument(201行)函数中注释的代码为下面的if语句。

            if (list.Count == 0)
            {
                argumentValue = null;
                return !required;
            }

在这里插入图片描述

这里当长度为0时,直接置空,然后根据required(命令行输入时是否必须填写)判断true或者false(必须时为长度为0返回false,否则为true),这里当未输入IceServerUrls的命令行参数时将其值置空,同时返回true,能够继续执行命令行解析的下面的代码

2.原因

在传入命令行参数时,会优先执行CommandLineParser.TryParse(arguments),这里的函数会尝试执行每个参数的解析。
在这里插入图片描述

看下图,这是解析IceServerUrls时的函数(CommandLineParser中的函数,大概201行),当解析出来的命令行参数IceServerUrls为空时,正常的处理应该是将值置空,而这里多了个requred参数,当required参数为false时,argumentValue = list.ToArray(),显然虽然list的长度为0,但它初始化了,argumentValue不为空
在这里插入图片描述
记住这里的不为空,这里是out传参,找找代码就能发现是修改了m_value的值,导致Value改变不为空
在这里插入图片描述
接着在WebSocketSignalingSettings(Http那个也一样)中的ParseArguments函数中
第一步,下图中1,先将json文件解析出来得到ice配置,这里解析是成功了的且正确的。
第二步,重点来了,还记得前面说过有个argumentValue 未置空,导致Value未被置空,而这里的CommandLineParser.IceServerUrls显然是初始化了的,运行CommandLineParser.IceServerUrls.Value,这个显然不为空(长度为0的string数组),导致urls不为空
第三步,这里在克隆m_iceServers的0号位置,传入的参数中有urls(不嫌麻烦的小伙伴可以试试,除了urls,其他三个参数均置空的)
在这里插入图片描述
来到这个克隆函数内部,只要传入参数不为空,就覆盖原始的值。当传入了json文件,其他命令行参数没有时,导致传入参数不为空(长度为0的string数组),覆盖了原始的值,ice配置的url被替换,根本连不上啊。
在这里插入图片描述

3.后话

非常严重的逻辑上的bug,新创个项目也是一样,打包,用json方式启动后,只有ice的url为空,其他值都能正确处理读取,简直离谱,找了半天bug。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值