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