问题描述
我正在尝试录制并从javascript上传音频。我可以从Blob
成功录制音频MediaRecorder
。我的理解是,在将多个块记录到Blob中之后,我会将它们串联为new Blob(audioBlobs)
并上传。不幸的是,服务器端的结果或多或少变得乱七八糟。我当前正在运行localhost连接,因此转换为未压缩的WAV并不是问题(可能稍后再发布,但这是一个单独的问题)。这是我到目前为止所拥有的
navigator.mediaDevices.getUserMedia({audio: true,video: false})
.then(stream => {
const mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(1000);
const audioChunks = [];
mediaRecorder.addEventListener("dataavailable",event => {
audioChunks.push(event.data);
});
function sendData () {
const audioBlob = new Blob(audioChunks);
session.call('my.app.method',[XXXXXX see below XXXXXX])
}
})
这里的session
对象是到Python服务器的autobahn.js
Websockets连接(使用soundfile
。我在由XXXXX
标记的位置尝试了许多参数在代码中。
- 只需传递
audioBlob
。在这种情况下,python端只会收到一个空字典。 - 在这种情况下,通过
audioBlob.text()
,我得到的东西看上去有些二进制(以OggS开头),但是无法解码。 - 通过
audioBlob.arrayBuffer()
。在这种情况下,Python端会收到一个空字典。
一个可能的解决方案是在服务器端将数据转换为WAV(仅更改blob上的mime类型不起作用)或找到一种方法来解释服务器端的.text()
输出
解决方法
解决方案是使用recorder.js,然后在其中使用getBuffer
方法将波浪数据作为Float32Array
。