FastAGI get_data函数异常:立即返回1且音频无法播放
我之前在Asterisk 13.x + Ubuntu 16.04的环境里碰到过几乎一模一样的问题,给你几个实操性的排查方向:
先核对get_data的参数格式
get_data的标准语法是get_data(filename, timeout, maxdigits),三个参数里filename不能留空,timeout(毫秒)和maxdigits必须是正整数。比如如果你写成get_data(my_sound,,)这种缺省参数的写法,Asterisk 13会直接返回错误码1。另外,尽量用绝对路径指定音频文件,比如get_data(/var/lib/asterisk/sounds/custom/prompt.wav, 5000, 1)——普通AGI可能能识别相对路径,但FastAGI的进程上下文和Asterisk主进程不同,相对路径容易出问题。检查AppArmor的限制
Ubuntu 16.04默认开启AppArmor,即使你给音频文件设置了755权限,Asterisk进程也可能被AppArmor阻止读取非默认路径的文件。你可以先临时关闭AppArmor测试:sudo systemctl stop apparmor如果关闭后音频能正常播放,就需要修改Asterisk的AppArmor配置文件(通常在
/etc/apparmor.d/usr.sbin.asterisk),添加你的音频路径规则,比如:/path/to/your/audio/files/** r,然后重启AppArmor生效。
开启Asterisk debug日志找细节
你提供的日志片段不够详细,建议开启更高等级的日志:在Asterisk控制台执行core set verbose 5和core set debug 3,然后重新触发FastAGI流程。重点看有没有类似file not found、permission denied或者invalid argument的报错信息——这些往往是问题的核心,比如有时候文件权限没问题,但Asterisk找不到文件,是因为路径里有特殊字符或者大小写错误。对比原生AGI脚本测试
写一个简单的原生AGI shell脚本(比如test_agi.sh),内容如下:#!/bin/bash echo "get_data /var/lib/asterisk/sounds/hello-world.wav 5000 1" read response echo "VERBOSE \"Got response: $response\" 3"给脚本加执行权限,然后在Asterisk拨号计划里调用这个原生AGI,看能不能正常播放音频。如果原生AGI没问题,那问题大概率出在FastAGI的通信逻辑上——比如你的FastAGI脚本有没有正确等待Asterisk的响应?会不会过早读取了返回值,导致Asterisk还没处理完音频就返回了1。
确认音频文件格式合规
虽然你说文件在普通AGI里能用,但还是要确认格式是Asterisk兼容的:用file命令检查文件:file /path/to/your/audio.wav正常的输出应该是
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 Hz。如果是其他格式(比如44.1kHz的立体声),Asterisk可能无法在FastAGI场景下正常解码播放。
内容的提问来源于stack exchange,提问作者Christopher Dias

