EAGI调用EXEC运行AMD等Asterisk应用时fd3无法同步接收音频问题
问题结论
这是Asterisk EAGI的预期工作机制,既不是BUG,也不是操作错误,和音频编码格式也没有关系。
原因说明
EAGI的文件描述符3(fd3)仅在AGI脚本持有呼叫控制权、等待输入指令时,才会持续推送音频流。当你通过EXEC命令调用任意Asterisk内置应用(包括AMD、Background、Playback等)时,呼叫控制权会临时转移到Asterisk核心的应用处理模块,此时Asterisk会停止向fd3写入音频数据,直到被调用的应用执行完毕、控制权交回AGI脚本后,fd3的音频流才会恢复传输,因此你会看到EXEC运行期间没有音频被录制。
可行解决方案
- 方案一:在AGI脚本内自行实现AMD检测逻辑,不调用
EXEC AMD。直接从fd3读取音频流,自己做静音检测和答录机判断,全程不交出呼叫控制权,即可同时实现检测和全程音频录制。 - 方案二:改用Asterisk内置的MixMonitor实现录音。在调用
EXEC AMD之前先执行EXEC MixMonitor /tmp/全程录音.wav,MixMonitor会在后台独立运行,不受后续EXEC应用的控制权转移影响,全程录制通话音频,你可以在脚本任意阶段读取生成的录音文件。该方案无需修改原有逻辑,兼容性最好。 - 方案三:如果可以升级Asterisk版本,升级到18及以上版本,该版本新增了
EAGI_AUDIO_STREAM_ALWAYS参数,在拨号计划调用EAGI前先设置Set(EAGI_AUDIO_STREAM_ALWAYS=yes),开启后即使执行EXEC类命令,fd3也会持续推送音频流,无需调整现有脚本逻辑。
补充说明
你测试使用的48kHz 16bit单声道音频格式和该问题无关,无论更换任何编码格式,只要控制权转移到Asterisk内置应用,低于18版本的Asterisk都会暂停fd3的音频输出,换编码无法解决问题。
内容的提问来源于stack exchange,提问作者Marki555
相关产品推荐
相关产品推荐

