【问题标题】: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 的限制。

    对于这种处理,另一种选择是使用以下流程。

    1. 使用 API Gateway 和 Lambda,请求 AWS CloudFront Signed URL 将音频文件上传到 AWS S3。
    2. 然后直接从客户端上传文件到S3。
    3. 将 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 文件完全相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-22
          • 2016-05-15
          • 2018-10-25
          • 1970-01-01
          • 2019-02-02
          • 2010-09-08
          相关资源
          最近更新 更多