Javascript 无法将二进制数据从jQuery保存到AWS S3中

Javascript 无法将二进制数据从jQuery保存到AWS S3中,javascript,amazon-web-services,html5-audio,getusermedia,Javascript,Amazon Web Services,Html5 Audio,Getusermedia,我正在尝试将一个Blob对象上传到S3中,该对象确实被上传了,但已损坏。该应用程序用于在网页上录制音频,并将其保存到S3 HTML+Javascript代码: <p> <button id=startRecord>START</button> <button id=stopRecord disabled>Submit</button> </p>

我正在尝试将一个
Blob
对象上传到S3中,该对象确实被上传了,但已损坏。该应用程序用于在网页上录制
音频
,并将其保存到S3

HTML+Javascript代码:

        <p>
            <button id=startRecord>START</button>
            <button id=stopRecord disabled>Submit</button>
        </p>
        <p id="recording"></p>
        <p>
            <a id=audioDownload></a>
        </p>

<script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>

<script type="text/javascript">

    var audioContent;
    navigator.mediaDevices.getUserMedia({audio:true})
    .then(stream => {
        rec = new MediaRecorder(stream);
        rec.ondataavailable = e => {
            audioChunks.push(e.data);
            if (rec.state == "inactive"){
            let blob = new Blob(audioChunks);
            // audioContent = blob
            // audioContent = URL.createObjectURL(new Blob(audioChunks));
            // console.log(audioContent);

                $.ajax({
                  type: "POST",
                  url: 'https://aws-api-url/prod/audio',
                  data: new Blob(audioChunks),
                  crossDomain: true,
                  processData: false,
                  headers: {"x-api-key": 'someKey'},
                  contentType: false
                });
        // audioDownload.href = audioContent;
        // audioDownload.download = 'test';
        // audioDownload.innerHTML = 'download';
            }
        }
    })
    .catch(e=>console.log(e));

startRecord.onclick = e => {
  startRecord.disabled = true;
  stopRecord.disabled=false;
  document.getElementById("recording").innerHTML = "Listening...";
  audioChunks = [];
  rec.start();
}
stopRecord.onclick = e => {
    document.getElementById("recording").innerHTML = "";
  startRecord.disabled = false;
  stopRecord.disabled=true;
  rec.stop();
}
</script>
我可以对Javascript进行哪些更改以安全地发送此数据

不会生成.wav数据类型。默认情况下,它可能会生成
音频/webm的数据;编解码器=作品
。或
音频/ogg;codec=vorbis
。lambda函数看起来像是忠实地存储了传入的数据。但它不是.wav数据,而是别的东西

您的示例代码允许MediaRecorder选择自己的MIME类型。在这种情况下,您应该询问它使用了什么。比如说

rec = new MediaRecorder(stream);
console.log (rec.mimeType);
或者,您可以(尝试)告诉它您想要的MIME类型。在这种情况下,您仍然应该询问它实际使用了什么。(浏览器生成的MIME类型各不相同,当它们无法提供您想要的确切类型时,它们的响应方式也各不相同。)如果您的浏览器能够做到这一点,那么这段代码可能会

或者,您可以尝试,看看您得到了什么音频编解码器。它可能因浏览器而异

您通常可以在录制任何MIME类型后使用将其转换为其他MIME类型。如果需要.wav输出或其他特定格式,这非常方便

不生成.wav数据类型。默认情况下,它可能会生成
音频/webm的数据;编解码器=作品
。或
音频/ogg;codec=vorbis
。lambda函数看起来像是忠实地存储了传入的数据。但它不是.wav数据,而是别的东西

您的示例代码允许MediaRecorder选择自己的MIME类型。在这种情况下,您应该询问它使用了什么。比如说

rec = new MediaRecorder(stream);
console.log (rec.mimeType);
或者,您可以(尝试)告诉它您想要的MIME类型。在这种情况下,您仍然应该询问它实际使用了什么。(浏览器生成的MIME类型各不相同,当它们无法提供您想要的确切类型时,它们的响应方式也各不相同。)如果您的浏览器能够做到这一点,那么这段代码可能会

或者,您可以尝试,看看您得到了什么音频编解码器。它可能因浏览器而异


您通常可以在录制任何MIME类型后使用将其转换为其他MIME类型。如果需要.wav输出或其他特定格式,这非常方便

我确实解决了这个
mimeType
问题,但是问题仍然存在。我发现lambda函数正在读取的是我的
事件['body']
as
str
,不确定这是否是问题所在。有什么想法吗?我不熟悉python语言AWS lambda端点。但是,我相信AWS会将POST操作的二进制有效负载编码为base64文本字符串。您需要使用
base64.b64decode()
将其转换为二进制对象。查看此::我确实修复了这个
mimeType
问题,但问题仍然存在。我发现lambda函数正在读取的是我的
事件['body']
as
str
,不确定这是否是问题所在。有什么想法吗?我不熟悉python语言AWS lambda端点。但是,我相信AWS会将POST操作的二进制有效负载编码为base64文本字符串。您需要使用
base64.b64decode()
将其转换为二进制对象。看这个::
rec = new MediaRecorder(stream, {mimeType: "audio/mpeg"});
console.log (rec.mimeType);