Javascript 未捕获(承诺中)DOMEException:无法解码音频数据
我在Chrome中使用Javascript 未捕获(承诺中)DOMEException:无法解码音频数据,javascript,node.js,websocket,web-audio-api,mediarecorder-api,Javascript,Node.js,Websocket,Web Audio Api,Mediarecorder Api,我在Chrome中使用WebAudioAPI播放decodeAudioData方法时遇到问题(在Firefox中效果很好)- 我正在从服务器发回媒体录制器录制的音频缓冲区 服务器端 wss = new WebSocketServer({server: server}, function () {}); wss.on('connection', function connection(ws) { ws.binaryType = "arraybuffer"; ws.on('mess
WebAudioAPI
播放decodeAudioData
方法时遇到问题(在Firefox中效果很好)-
我正在从服务器发回媒体录制器录制的音频缓冲区
服务器端
wss = new WebSocketServer({server: server}, function () {});
wss.on('connection', function connection(ws) {
ws.binaryType = "arraybuffer";
ws.on('message', function incoming(message) {
if ((typeof message) == 'string') {
console.log("string message: ", message);
} else {
console.log("not string: ", message);
ws.send(message);
}
});
});
客户端
window.AudioContext = window.AudioContext||window.webkitAudioContext;
navigator.getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
var context = new AudioContext();
var mediaRecorder;
var chunks = [];
var startTime = 0;
ws = new WebSocket(url);
ws.binaryType = "arraybuffer";
ws.onmessage = function(message) {
if (message.data instanceof ArrayBuffer) {
context.decodeAudioData(message.data, function(soundBuffer){
playBuffer(soundBuffer);
},function(x) {
console.log("decoding failed", x)
});
} else {
console.log("not arrayBuffer", message.data);
}
};
createMediaRecorder();
function createMediaRecorder() {
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
var constraints = {
"audio": true
};
var onSuccess = function(stream) {
var options = {
audioBitsPerSecond : 128000,
mimeType : 'audio/webm\;codecs=opus'
};
mediaRecorder = new MediaRecorder(stream, options);
};
var onError = function(err) {
console.log('The following error occured: ' + err);
};
navigator.getUserMedia(constraints, onSuccess, onError);
} else {
alert('getUserMedia not supported on your browser!');
}
}
function playBuffer(buf) {
var source = context.createBufferSource();
source.buffer = buf;
source.connect(context.destination);
if (startTime == 0)
startTime = context.currentTime + 0.1; // add 50ms latency to work well across systems
source.start(startTime);
startTime = startTime + source.buffer.duration;
}
function startRecording() {
mediaRecorder.start();
getRecordedData();
}
function getRecordedData() {
mediaRecorder.ondataavailable = function(e) {
console.log('ondataavailable: ', e.data);
chunks.push(e.data);
};
}
function sendRecordedData() {
var superBuffer = new Blob(chunks, {type: 'audio/ogg'});
ws.send(superBuffer);
}
function stopRecording() {
mediaRecorder.stop();
mediaRecorder.onstop = function(e) {
sendRecordedData();
chunks = [];
};
}
使用firefox进行测试时工作正常,但使用chrome时会产生以下错误:
Uncaught (in promise) DOMException: Unable to decode audio data
任何建议都会有帮助,提前谢谢 我遇到了同样的问题。将Chrome升级到最新版本,如85.0.4183,为我解决了这个问题。我遇到了同样的错误。更新Chrome并没有修复它。然而,在Firefox中调试反而给了我一个更具描述性的错误:
The buffer passed to decodeAudioData contains an unknown content type.
Uncaught (in promise) DOMException: MediaDecodeAudioDataUnknownContentType
Uncaught (in promise) DOMException: The given encoding is not supported.
顺便说一下,这是因为找不到我要加载的.mp3文件。因此,我发出了一个web请求,接收404 HTML页面,并尝试将其作为mp3加载,但由于“不受支持的音频格式”而失败。音频是两种浏览器都可以播放的格式吗?我也有同样的问题。在firefox上运行良好,但在chrome上不适用于
MediaRecorder
(“opus”编解码器)生成的.ogg
文件。看起来这已经是一个令人吃惊的问题很久了。见和。编辑:哦,令人惊讶的是,看起来我们可能会有一个修复。据推测,截至今天,它已于6天前修复(见409402中的最后一条评论)。我不确定这需要多长时间才能发布。@CodingTrigue请发布您的解决方案。非常感谢。