如何通过在 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 中播放(据此,它是一个MonoIMA WAV APDCM Audio (ms) 文件,采样于24000Hz16 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 中,我在readADPCMencodeAudio16bit 读取UInt8Array 并编码16 位音频的函数中找到了合适的答案。

【讨论】:

此答案应包含相关代码的代码示例,引导 OP 选择此作为适当的答案 上面的链接坏了:(

以上是关于如何通过在 JavaScript 中构造 AudioBuffer 来正确播放 WAV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript使用构造函数获取变量的类型名

JavaScript使用构造函数获取变量的类型名

16.javascript 数组的操作

Audi Enter-Sandbox 创建属于自己的赛道

通过连接构造Javascript字符串?

如何在 javascript 中使用构造函数和图像?