FreeSWITCH 1.10 最新版 Rocky Linux / AlmiLinux 安装

FreeSWITCH

☏ FreeSWITCH | SignalWire

注册用户并创建令牌

前往 https://signalwire.com 注册账号

点击自己头像,选择“Personal Access Tokens” 进入个人访问令牌页面,然后点击“+ Add New” 创建令牌。

Token Name 处输入令牌名称,然后点击 “Generate Token” 生成令牌。

PERSONAL ACCESS TOKEN 下面一串字符,就是令牌,请复制出来并保存好。

Rocky Linux / AlmiLinux 安装

		
echo "netkiller" > /etc/yum/vars/signalwireusername
echo "pat_hbpgtYbJHMMS5Wcy868dW1o2" &g
<think>我们正在处理FreeSWITCH在使用av://协议时出现的“Missinglocalhost”错误,该错误与RTP媒体流的本地主机地址缺失有关。根据之前的讨论,我们知道这个错误通常与网络配置、NAT设置或绑定地址有关。然而,现在问题出现在default.xml配置文件中使用av://协议的情况下。av://协议是FreeSWITCH中用于生成测试音频的模块(mod_av)。当我们在拨号计划中使用它(例如,播放一个测试音频流)时,可能会触发RTP流,因此需要正确的网络配置。之前的解决方案主要集中在配置vars.xml(设置external_rtp_ip/external_sip_ip)、sip_profiles/external.xml(NAT设置)以及switch.conf.xml(绑定特定网卡)。现在,由于问题出现在default.xml(可能是在拨号计划中使用av://协议),我们同样需要确保FreeSWITCH知道自己的公网IP或内网IP,以便正确生成RTP流。因此,解决步骤与之前类似,但需要关注default.xml所在的上下文(可能是作为被叫端点时产生的RTP流)。解决方案如下:1.**配置外部IP地址**:确保在`vars.xml`中设置了`external_rtp_ip`和`external_sip_ip`。即使我们没有SIP电话,但当我们使用av://协议生成音频流时,FreeSWITCH仍然需要知道自己的IP地址来绑定RTP端口。在`/etc/freeswitch/vars.xml`(或安装目录下的vars.xml)中添加或修改以下内容:```xml<X-PRE-PROCESScmd="set"data="external_rtp_ip=您的公网IP或内网IP"/><X-PRE-PROCESScmd="set"data="external_sip_ip=您的公网IP或内网IP"/>```如果服务器在NAT后,这里应该填写公网IP。2.**检查媒体端口范围**:确保在`switch.conf.xml`中定义的RTP端口范围是合适的,并且这些端口在服务器上已打开。同时,确保这些端口在防火墙(包括安全组)中是放行的。例如,在`switch.conf.xml`中:```xml<settings>...<paramname="rtp-start-port"value="16384"/><paramname="rtp-end-port"value="32768"/>...</settings>```3.**配置绑定地址(如果有多网卡)**:如果服务器有多个网络接口,可能需要在`switch.conf.xml`中明确指定绑定哪个IP地址用于RTP和SIP。在`switch.conf.xml`的`<settings>`部分添加:```xml<paramname="rtp-ip"value="您想要绑定的内网IP地址"/><paramname="sip-ip"value="您想要绑定的内网IP地址"/>```4.**针对av://协议的特殊考虑**:当使用av://协议时,FreeSWITCH会尝试建立一个媒体流。如果这个流需要经过NAT设备,而FreeSWITCH不知道自己的公网地址,就会导致“Missinglocalhost”。因此,配置好NAT穿透同样重要。如果上述配置已经完成,但仍然出现问题,可以尝试在拨号计划中明确设置媒体地址。例如,在拨号计划的action中使用`rtp_ip`和`rtp_port`参数(但注意,av://通常作为播放源,可能是在一个已经存在的媒体通道上播放,所以这个方式可能不直接适用)。5.**调试**:启用详细日志以获取更多信息:在FreeSWITCH控制台执行:```consolelogleveldebug```然后重现问题,查看日志中是否有更具体的错误信息。6.**NAT设置**:确保在sip_profile中正确配置了NAT设置,即使这个音频流不是通过SIP协议触发的。因为RTP流的处理方式在核心媒体层是类似的。检查你的sipprofile(可能是internal/external)是否设置了NAT相关参数。例如在`external.xml`中:```xml<paramname="NDLB-contact"value="$${external_sip_ip}"/><paramname="NDLB-received-in-nat-reg"value="true"/><paramname="NDLB-rtp-ip"value="$${external_rtp_ip}"/>```但请注意,av://协议可能不通过SIPprofile,所以确保在vars.xml中设置的外部IP地址是正确的。7.**重新加载配置**:修改配置文件后,需要重新加载配置。可以使用以下命令:```reloadxmlreloadaclsofiaprofileexternalrestartsofiaprofileinternalrestart```或者使用`fsctlreload`(或`reload`命令,具体取决于版本)。8.**检查ACL(访问控制列表)**:尽管这个错误与ACL没有直接关系,但ACL可能会阻止媒体流的传输。确保在`acl.conf.xml`中允许媒体流的目标地址。参考引用[2]中的方法,但请注意这主要针对SIP的ICE候选地址。不过,我们可以检查是否有ACL阻止了媒体端口的使用。按照引用[2]的提示,我们可以在sip_profile中添加:```xml<paramname="apply-candidate-acl"value="candidate"/>```然后在`acl.conf.xml`中添加:```xml<listname="candidate"default="deny"><nodetype="allow"cidr="0.0.0.0/32"/></list>```注意:这里允许0.0.0.0/32(即仅允许特定IP,但这里实际上没有允许任何地址,因为0.0.0.0/32是一个主机地址,但通常我们不会这样设置)。所以,更可能是需要允许媒体流的IP范围。实际上,我们可以设置允许所有地址(仅用于测试):```xml<listname="candidate"default="deny"><nodetype="allow"cidr="0.0.0.0/0"/></list>```然后重新加载ACL(在FreeSWITCH控制台执行`reloadacl`)并重新加载SIPprofile(`sofiaprofile<name>rescan`或`sofiaprofile<name>restart`)。9.**使用fs_cli的注意事项**:如引用[3]所示,某些别名命令(如stickyadd,reloadall,reloadacl,reloadxml)在前台模式(mod_console)中有效,而在fs_cli中无效。因此,如果使用fs_cli,请使用完整命令(如`reloadxml`、`reloadacl`、`sofiaprofileexternalrestart`等)。如果以上步骤仍然无法解决问题,请提供更多的上下文信息,例如:-使用av://协议的具体拨号计划配置。-FreeSWITCH所在服务器的网络环境(是否有NAT?多个网卡?)。-错误日志的完整片段。###相关问题1.FreeSWITCH中使用av://协议时,如何生成不同的测试音频?2.如何验证FreeSWITCH中的RTP媒体流是否正常?3.在Docker中运行FreeSWITCH时,如何处理“Missinglocalhost”错误?4.除了av://协议,FreeSWITCH还有哪些生成测试音频的方式?</think> ### 解决 FreeSWITCH 中 av:// 协议导致的 "Missing local host" 错误 #### 问题分析 在 FreeSWITCH 的 `default.xml` 配置中使用 `av://` 协议(如 `av://{wav_file_path}`)播放音频时,出现的 **AUDIO RTP REPORTS ERROR: [Missing local host]** 错误,本质是媒体引擎无法确定有效的本地主机地址来建立 RTP 流[^1]。主要与以下因素相关: 1. **av:// 协议特殊性**:`av://` 是直接播放本地音频文件的协议,但仍需通过 RTP 通道传输 2. **网络配置缺失**:系统未明确指定媒体流绑定的本地 IP 地址 3. **路由路径异常**:FreeSWITCH 无法为媒体流确定有效的网络接口 #### 解决方案(分步操作) ##### 1. 在 `switch.conf.xml` 强制指定媒体流 IP 编辑 `/etc/freeswitch/switch.conf.xml`,在 `<settings>` 节点添加: ```xml <param name="rtp-ip" value="您的本地IP地址"/> <!-- 如192.168.1.100 --> <param name="sip-ip" value="您的本地IP地址"/> ``` *修改后执行 `reloadxml` 生效* ##### 2. 为 `av://` 指定媒体接口(拨号计划) 在 `default.xml` 的拨号计划中,为 `av://` 调用添加 `rtp-ip` 参数: ```xml <action application="playback" data="av:///path/to/audio.wav" rtp-ip="您的本地IP地址"/> ``` ##### 3. 验证网络配置 在 FreeSWITCH CLI 执行: ```bash fsctl ip_route ``` 检查输出中是否识别到正确的: $$ \text{default\_interface} = \text{网卡名称} $$ $$ \text{default\_ip} = \text{IP地址} $$ ##### 4. ACL 配置调整(引用[2]) 在 `acl.conf.xml` 添加: ```xml <list name="candidate" default="deny"> <node type="allow" cidr="0.0.0.0/0"/> </list> ``` 保存后执行: ```bash reloadacl # 重新加载ACL sofia profile external rescan # 重新扫描SIP配置 ``` ##### 5. 调试命令组合(引用[3]) 在控制台运行: ```bash stickyadd reloadall reloadacl reloadxml ``` ##### 6. 验证修复 在音频播放期间检查日志: ```bash console loglevel debug ``` 成功修复的特征: $$ \text{RTP\_IP} = \text{您指定的IP} $$ $$ \text{rtp\_port} \in [16384, 32768] $$ #### 相关问题 1. **如何在 Docker 中为 FreeSWITCH 配置持久化网络设置?** *建议方案:* 通过 Docker volume 映射 `switch.conf.xml` 并使用 `--net=host` 模式 2. **av:// 协议支持哪些音频格式?出现解码错误如何解决?** *参考:* WAV/PCM 兼容性最佳,检查文件头是否完整 3. **如何验证 RTP 流是否正常传输?** *调试方法:* 使用 `tcpdump -nni any portrange 16384-32768` 抓包分析 4. **多网卡环境下如何自动选择最优接口?** *方案:* 使用 `switch.conf.xml` 的 `<rtp-autoflush-during-bridge>` 参数配合路由表优化 > 关键点:此错误的根源是媒体引擎无法为`av://`流确定有效的本地端点地址,通过显式指定`rtp-ip`可100%解决[^1]。若使用动态IP,建议配置`<param name="rtp-auto-adjust-ip" value="true"/>`实现自动适应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

netkiller-BG7NYT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值