在使用SIP注册代理的场景中,经常遇到 FS向注册代理服务器请求外呼时,由于注册代理服务器的地址为内网,所以FS的请求SDP会自动切换为内网,这是使得FS的媒体不能直接和客户端进行RTP通信。

所以有些场景会需要FS固定SDP为公网地址,代理服务器进行媒体绕过,FS直接和客户端进行媒体通信。

增加一个通道变量 fix_extrtpip ,设为 true时,呼叫发起是则强制SDP的地址为 external_rtp_ip配置的值。

源码中增加该变量的控制

freeswitch 1.10.1 版本 switch_core_media.c -> switch_core_media_choose_port 函数。

增加的代码是红色部分:

if(switch_channel_var_true(session->channel, "fix_extrtpip")){

use_ip = smh->mparams->extrtpip;

}else{

/* No NAT traversal required, use the profile's rtp ip */

use_ip = smh->mparams->rtpip;

}

在源码中的大致位置 8214 行:

/* Check if NAT is detected  */if (!zstr(smh->mparams->remote_ip) && switch_core_media_check_nat(smh, smh->mparams->remote_ip)) {/* Yes, map the port through switch_nat */switch_nat_add_mapping(engine->local_sdp_port, SWITCH_NAT_UDP, &sdp_port, SWITCH_FALSE);switch_snprintf(vname, sizeof(vname), "rtp_adv_%s_ip", tstr);/* Find an IP address to use */if (!(use_ip = switch_channel_get_variable(session->channel, vname))&& !zstr(smh->mparams->extrtpip)) {use_ip = smh->mparams->extrtpip;}if (use_ip) {if (switch_core_media_ext_address_lookup(session, &lookup_rtpip, &sdp_port, use_ip) != SWITCH_STATUS_SUCCESS) {/* Address lookup was required and fail (external ip was "host:..." or "stun:...") */return SWITCH_STATUS_FALSE;} else {/* Address properly resolved, use it as external ip */use_ip = lookup_rtpip;}} else {/* No external ip found, use the profile's rtp ip */use_ip = smh->mparams->rtpip;}} else {+ //add by aominle [20211021] : 强制sdp为公网IP+  if(switch_channel_var_true(session->channel, "fix_extrtpip")){use_ip = smh->mparams->extrtpip;+    }else{/* No NAT traversal required, use the profile's rtp ip */use_ip = smh->mparams->rtpip;}}

用法:

在发起呼叫是增加通道变量 {fix_extrtpip=true}

将Freeswitch SDP 固定为 external_rtp_ip相关推荐

  1. Freeswitch 开发日记

    欢迎参考 在此记录freeswitch开发的点点滴滴,供同行交流.欢迎大家多留言讨论,如此,这一主题才能壮大下去. Sofia library [2020-6-22] Freeswitch采用Sofi ...

  2. Freeswitch 音视频编码支持

    关于编码理论,可以看维基 http://en.wikipedia.org/wiki/Codec 1. freeswtich对高清(HD)语音编码的支持 freeswitch支持 大部分高清语音编码,包 ...

  3. FreeSwitch Sip【转】

    在继续学习 FreeSWITCH 之前我们有必要来学习一下 SIP 协议,因为它是 FreeSWITCH 的核心.但即使如此,讲清楚 SIP 必然需要很大篇幅,本书是关于 FreeSWITCH 的,而 ...

  4. freeswitch部署及网关调试

    freeswitch部署及网关调试 目录 freeswitch部署及网关调试... - 1 - 一.freeswitch部署... - 3 - (一)基础部署... - 3 - (二)根据实际情况需求 ...

  5. FreeSwitch的安装部署

    FreeSwitch的版本历程 2006年-第一个版本 2008年-1.0凤凰版 2012年-Freeswitch 1.2 2014年-FreeSwitch 1.4       WebRTC 2015 ...

  6. 简单了解音视频传输协议SDP、RTP、RTMP、SIP等

    SDP 会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述.参考RFC2327(Request For Comments(RFC),是一系列以编号排定的文 ...

  7. FreeSWITCH异常原因总结

    最经在玩FreeSWITCH的时候,遇到很多的问题,特此总结一下,希望以后不要犯类似的错误了: 1.Client端无法注册,但是FS运行正常? 解决办法:查看防火墙是否关闭./etc/init.d/i ...

  8. FreeSWITCH 学习笔记(一)

    [1]FreeSWITCH学习笔记 1.Windows安装包下载地址: http://files.freeswitch.org/windows/installer/ 2.源码下载地址: http:// ...

  9. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

最新文章

  1. javascript之DOM操作
  2. MyBatis下MySqL用户口令不能为空
  3. [蓝桥杯2018初赛]方格计数-巧妙枚举,找规,数论
  4. openwrt 19 overlay 空间不足_重视 | 山西一矿井瓦斯爆炸,有限空间作业切记注意安全...
  5. Lambda、函数式接口、Stream 一次性全给你
  6. Spark 机器学习 —— 从决策树到随机森林
  7. windows安装pip包
  8. 用友U8自定义按钮开发
  9. js 表单打开新窗口
  10. MyBatis递归查询
  11. MSG数据(EUMETSAT)和GOES数据(NOAA)下载
  12. RAID磁盘阵列详解
  13. 教你电脑微信多开方法,超级简单_多啦咪
  14. Invalid bound statement (not found)出现原因和解决方法
  15. uva12489 Combating cancer(树同构)
  16. Intriguing properties of neural networks——L-BFGS attack
  17. 【JavaWeb】JQuery实现广告显示和隐藏动画效果
  18. Mac下查看本机IP地址
  19. Mathorcup数学建模竞赛第六届-【妈妈杯】B题:车位分布的优化设计与评价(附一等奖获奖论文和matlab代码)
  20. 写作必备文献搜索网大全

热门文章

  1. django-创建项目-创建应用-注册应用-配置mysql连接pycharm-连接django-生成数据表
  2. AWS EC2启动Centos实例以及设置root密码登录
  3. ssh_exchange_identification: Connection closed by remote host解决方法
  4. EmptyPage(空白页组件)原理与使用
  5. 我的AI之路 —— 从裸机搭建GPU版本的深度学习环境
  6. Differential Geometry之第九章常平均曲率曲面
  7. SQL --几张表公有字段的查询
  8. 实现MySQL逗号数据计数
  9. Android美工坊--一个QQ登录验证的小例子
  10. 9th, Jan 2012 养成好的生活习惯真的很不容易