如何通过在 JavaScript 中构造 AudioBuffer 来正确播放 WAV 文件?
Posted
技术标签:
【中文标题】如何通过在 JavaScript 中构造 AudioBuffer 来正确播放 WAV 文件?【英文标题】:How to properly play a WAV file by constructing an AudioBuffer in JavaScript? 【发布时间】:2016-06-25 04:33:43 【问题描述】:我正在努力玩this WAV file,它在 VLC 中播放(据此,它是一个Mono
、IMA WAV APDCM Audio (ms)
文件,采样于24000Hz
和16 bits per sample
)。
我怀疑WAV文件本身有问题,因为当我尝试通过直接嵌入它来播放它时通过 <audio>
,播放按钮处于非活动状态......当我尝试播放时它以编程方式使用new Audio()
,我收到错误Failed to load because no supported source was found.
这是我尝试过的最简单的示例,它会产生 some 声音……我尝试过的其他尝试尝试使用 AudioContext.decodeAudioData
加载音频时全部窒息,抛出 Unable to decode audio data
.
这个例子产生了一些可以辨认的声音,但我显然做错了什么,因为它太沙哑了——我的理解是AudioBuffer
需要一个Float32Array
,其值介于[-1,1]
之间,而这些没有'吨。但我不知道如何规范化它们,因为许多值的顺序是10e32
。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
</style>
</head>
<body>
<script>
var context = new AudioContext();
function loadSound(url)
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "arraybuffer";
request.onload = function()
data = new Uint8Array(request.response);
var buffer = context.createBuffer(1, data.length, 24000);
var channelData = buffer.getChannelData(0);
for (var i = 0; i < data.length; i++)
channelData[i] = data[i];
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(0);
request.send();
loadSound('./test.wav');
</script>
</body>
</html>
任何帮助将不胜感激;谢谢!
【问题讨论】:
【参考方案1】:在this phosphorous
issue 中,我在readADPCM
和encodeAudio16bit
读取UInt8Array
并编码16 位音频的函数中找到了合适的答案。
【讨论】:
此答案应包含相关代码的代码示例,引导 OP 选择此作为适当的答案 上面的链接坏了:(以上是关于如何通过在 JavaScript 中构造 AudioBuffer 来正确播放 WAV 文件?的主要内容,如果未能解决你的问题,请参考以下文章