使用Twilio播放S3公共URL音频时出现11200错误求助
问题:Twilio播放S3存储的音频报错Error 11200(HTTP检索失败)
我通过twilio-node播放AWS S3上的语音信箱问候音频时,通话末尾会提示"An application error has occurred...",Twilio控制台显示错误码11200(HTTP检索失败)。
相关细节
- 用nestjs-s3上传音频,ContentType设为
audio/x-wav,文件ACL已设为public-read,浏览器能正常打开播放该音频 - 手动上传到同一S3路径的音频,Twilio可以正常播放
上传代码(nestjs-s3)
await this.s3 .putBucketVersioning({ Bucket: 'abc', VersioningConfiguration: { MFADelete: 'Disabled', Status: 'Enabled', }, }) .promise() .catch(error => { console.error(error); throw new ServiceUnavailableException(error, error.message); }); // 校验音频类型 if (file.mimetype.indexOf('audio/') === -1) { throw new UnsupportedMediaTypeException(); } this.logger.debug(`file.mimetype: ${file.mimetype}`); await this.s3 .upload({ Bucket: 'abc', Key: `voicemail-greetings/${slugify(file.originalname, { lower: true, locale: 'fr', })}`, Body: file.buffer, CacheControl: 'no-cache', ContentType: file.mimetype, ACL: 'public-read', }) .promise() .catch(error => { if (error.code === 'NoSuchBucket') { this.logger.warn("Bucket doesnt exist"); throw new UnprocessableEntityException(error, error.message); } throw new InternalServerErrorException(error, error.message); });
Twilio播放代码
const url = `https://abc.s3.eu-west-3.amazonaws.com/voicemailgreetings/${proTarget.proOrganizationId}.wav`; voiceResponse.play(url);
生成的XML响应
<?xml version="1.0" encoding="UTF-8"?> <Response> <Play>https://abc.s3.eu-west-3.amazonaws.com/voicemail-greetings/18.wav</Play> <Record playBeep="true" action="/beta/pro/call/record-end"/> </Response>
排查修复方案
核对S3对象元数据
对比手动上传和代码上传文件的元数据,重点确认:Content-Type必须是audio/x-wav,避免因文件识别问题导致Twilio无法解析Content-Length是否和文件实际大小一致,排除上传时buffer损坏的可能
可以临时把Cache-Control改成public, max-age=3600,测试是否是缓存策略导致的问题
严格校验URL路径
上传代码的Key路径是voicemail-greetings/xxx,但Twilio代码里拼接的URL写的是voicemailgreetings/xxx(少了横杠),虽然XML里的路径是对的,但要确保每次生成的URL完全匹配S3对象的Key,避免拼写错误。检查S3权限细节
即便设置了public-read,也要确认:- 桶的Bucket Policy没有添加拒绝匿名访问的规则,避免覆盖ACL权限
- 因为开启了桶版本化,要确保访问的是最新版本的音频对象
确认音频格式符合Twilio要求
Twilio对WAV文件有硬性要求:- 采样率:8kHz或16kHz
- 位深:16位
- 声道:单声道
可以用ffmpeg检查文件参数:
ffmpeg -i your-file.wav如果不符合,转码后再上传测试。
模拟Twilio请求测试
用curl模拟Twilio的请求头访问S3 URL,查看响应状态:curl -H "User-Agent: TwilioProxy/1.1" https://abc.s3.eu-west-3.amazonaws.com/voicemail-greetings/18.wav -I如果返回4xx/5xx,说明S3端存在访问问题;如果返回200,重点检查响应头的
Content-Type是否正确。
内容的提问来源于stack exchange,提问作者LamsaLL
相关产品推荐
相关产品推荐

