Javascript 未捕获(承诺中)DOMEException:无法解码音频数据

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

我在Chrome中使用
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请发布您的解决方案。非常感谢。