我们在使用freeswitch进行视频会议时,之前所有的用户都是通过外网的方式接入,因为fs给其返回的sdp协议内容里,只需要fs配置的外网IP就可以了;最近由于引入新的业务需要有其他内网的服务器也可以直接接入fs的视频会议房间,这样就需要在内网服务器接入时,返回给其fs的内网地址;在测试验证中,发现内网的服务器接入后,返回的answer的sdp内容里,IP仍然是ext-rtp-ip的地址(verto方式接入);
经过各种查询资料和chatgpt仍然没有解决掉,只好回头看fs的源码,发现在switch_core_media.c里有一段处理本地sdp返回ip的处理方法:switch_core_media_choose_port,里面有一段代码用于设置返回sdp里的fs的ip的一段逻辑,switch_snprintf(vname, sizeof(vname), "rtp_adv_%s_ip", tstr);设置了两个参数值:rtp_adv_audio_ip和rtp_adv_video_ip;有这两个参数时,use_ip会从这两个参数最值;
这样就可以在dailplan的执行计划里做相应的处理了:
通过上面的配置,让内网的服务器接入-local的逻辑处理,设置上面的两个参数值为本地的ip(local_ip_v4),没有-local的执行计划,这两个参数设置为:external_rtp_ip(配置为外网ip),即可实现一套fs即支持内网也支持外网的入会逻辑处理了。