如何在Asterisk AMI外呼应用中录制含回铃音的完整通话?
你遇到的这个问题其实很常见——默认情况下,MixMonitor要等通道桥接(也就是被叫用户实际接听)之后才会开始写入真实的音频数据,而Dial过程中的回铃音属于「早期媒体(Early Media)」,这部分音频在默认配置下不会被捕获,所以只会生成一个44字节的WAV头文件,直到通话接通后文件大小才会增长。
下面给你几个可行的解决方案,按易用性排序:
1. 给Dial命令添加r选项(最简单的方法)
修改你的Dial命令,加上r参数,这个选项会让Asterisk在Dial发起后就把早期媒体(包括回铃音)传递到主叫通道,这样MixMonitor就能捕获到这部分声音了。
修改后的extension.conf配置如下:
[from-internal] exten => _X.,1,NoOP() same => n,MixMonitor(${DialMonitorFile}.wav) same => n,Dial(PJSIP/${EXTEN}@TRUNK_100-1234-5678,30,r)
小提示:这个选项需要你的PJSIP中继支持早期媒体传递,你可以检查下对应中继的PJSIP配置,确保
allow_early_media设置为yes(默认一般是开启的,但最好确认下)。
2. 改用Monitor命令替代MixMonitor(兼容旧版本)
如果你的Asterisk版本比较老,或者r选项没起作用,可以试试Monitor命令。它的行为是从通道创建的那一刻就开始录制,天然支持捕获早期媒体。如果想要和MixMonitor一样的混合单文件效果,加上m参数就行。
调整后的配置:
[from-internal] exten => _X.,1,NoOP() same => n,Monitor(wav,${DialMonitorFile},m) same => n,Dial(PJSIP/${EXTEN}@TRUNK_100-1234-5678,30)
3. 通过AMI提前启动MixMonitor(进阶方案)
如果上面两种方法都不满足需求,你可以在发起Originate请求后,立刻通过AMI给目标通道发送MixMonitor命令,这样能从通道创建的第一时间就开始录制,完全不会错过任何音频。
具体操作步骤:
- 首先通过AMI发送
Originate请求,拿到主叫通道的ID(可以从Originate的响应或者后续的Newchannel事件中获取)。 - 紧接着给这个通道发送MixMonitor命令:
Action: MixMonitor Channel: PJSIP/[你的通道ID] File: ${DialMonitorFile}.wav Options: m
最后验证小技巧
测试的时候可以拨打一个能听到清晰回铃音的号码,录制完成后用音频播放器打开WAV文件,检查开头是否包含回铃音部分。另外要确保你的Asterisk版本支持对应的选项(比如Dial的r选项在Asterisk 11及以上版本都支持),同时确认运营商的中继支持早期媒体传递,不然即使开启了选项也可能拿不到回铃音。
内容的提问来源于stack exchange,提问作者user727062

