如何在Javascript中重放音频Blob?

问题描述:

我想重播一个音频blob(wav),使用Web Audio API以javascript记录。如何在Javascript中重放音频Blob?

我试过如下:

function replayBlob(blob) { 
    var blobURL = window.URL.createObjectURL(blob); 
    var audio0 = new Audio(blobURL); 
    audio0.play(); 
} 

但这代码不重放音频斑点。

我还试图通过HTML音频标记重放斑:

<audio id="wavSource" 
    src="blob:http%3A//localhost/f0b6bae9-7c70-4793-8436-7755a40bae3f" 
    type="audio/wav" controls> 
</audio> 

与BLOB源被设置以编程方式使用:

var blobURL = window.URL.createObjectURL(blob); 
document.getElementById("wavSource").src = blobURL; 

和音频播放呼叫使用:

document.getElementById("wavSource").play(); 

但没有声音播放。

为了验证,我下载了斑点与:

var a = document.createElement("a"); 
document.body.appendChild(a); 
a.style = "display: none"; 
a.href = blobURL; 
a.download = "test.wav"; 
a.click(); 

下载的BLOB包含了wav格式正确的音频数据。 如何从JavaScript中的blob播放此音频数据?

+1

你确定斑是wav格式?这意味着如果你下载的blob,它会播放媒体播放器... – dandavis

+0

是的,它播放媒体播放器。任何其他想法,为什么我可能听不到任何东西? – user2212461

+1

尝试添加控件并将其附加到身体,看看你是否可以这样玩 – dandavis

如果您使用网络音频录制,我想你也可以使用它进行播放,对吧?如果是这样,recorder.js在自述文件中有一个操作方法:https://github.com/mattdiamond/Recorderjs

我会继续并复制这里的要点,以防万一recorder.js在将来发生变化。你有两个Float32Arrays(左和右声道),然后做到这一点;

function getBufferCallback(buffers) { 
    var newSource = audioContext.createBufferSource(); 
    var newBuffer = audioContext.createBuffer(2, buffers[0].length, audioContext.sampleRate); 
    newBuffer.getChannelData(0).set(buffers[0]); 
    newBuffer.getChannelData(1).set(buffers[1]); 
    newSource.buffer = newBuffer; 

    newSource.connect(audioContext.destination); 
    newSource.start(0); 
} 

最简单的方法是转换到64位编码

const reader = new FileReader(); 
reader.onload = function(e) { 
    const srcUrl = e.target.result; 
    audioNode.src = srcUrl; 
}; 
reader.readAsDataURL(blob);