【问题标题】:API Gateway Binary Support with .wav File.wav 文件的 API 网关二进制支持
【发布时间】:2018-01-03 08:42:11
【问题描述】:
目前我有一个设置,其中 API 网关接受来自 POST 请求的 .wav 文件,并将音频文件中的 base64 编码数据发送到我使用其二进制支持系统作为处理程序的 lambda 函数。
我需要将来自网关的音频文件的 base64 编码转换回 .wav 格式而不写入新文件并读取,因为 AWS lambdas 是只读文件系统。
我尝试过new Buffer(data, 'base64').toString('binary'),希望它会起作用,但它没有,而且没有太多关于如何做到这一点的信息。
【问题讨论】:
标签:
node.js
amazon-web-services
aws-lambda
wav
aws-api-gateway
【解决方案1】:
在您的用例中使用 API Gateway 和 Lambda 时,您主要需要研究两个 limitations。
- 音频文件的最大大小为 10MB
- 如果您需要将文件存储在 /tmp 中进行处理,您最多可以保存 512MB
因此,大多数情况下,您的音频文件将受到 10MB 的限制。
对于这种处理,另一种选择是使用以下流程。
- 使用 API Gateway 和 Lambda,请求 AWS CloudFront Signed URL 将音频文件上传到 AWS S3。
- 然后直接从客户端上传文件到S3。
- 将 Lambda 触发器从 S3 存储桶发送到 Lambda 函数进行处理(最大文件大小为 512 MB)
【解决方案2】:
只要您的文件小于 512MB,您就可以在 Lambda 中将文件写入/tmp。
【解决方案3】:
为好奇的人找出问题所在。
当 API 网关使用其二进制支持系统对请求正文进行编码时,它们还会对正文中的 WebKitBoundary 标题和尾部数据(如果存在)进行编码。
它只是剪掉了与该数据相关的编码的前端和尾部,所以只剩下严格的.wav 数据,然后使用...将其重新创建为Buffer...
let audio = new Buffer(body, 'base64').toString('binary')
// Sequence of replacements and slices to remove WebKitBoundary header and tail
const audioBuffer = new Buffer(audio, 'binary')
audioBuffer 的结果与使用fs 模块简单地读取.wav 文件完全相同。