填写我自己的网络音频缓冲区不起作用

Posted

技术标签:

【中文标题】填写我自己的网络音频缓冲区不起作用【英文标题】:Filling in my own Web Audio Buffer is not working 【发布时间】:2014-11-07 05:42:52 【问题描述】:

我将网络音频用于各种目的,虽然通过 URL 加载的样本和振荡器正常工作和播放,但构建自定义源缓冲区却不行。我尝试使用下面的代码将我自己的 AudioBuffer 加载到 AudioBufferSourceNode 中,并通过 Chrome-NetBeans 调试器我可以看到它正在使用数据加载缓冲区并且没有标记任何错误,但是当调用 start 时,没有声音产生。请注意,我只是用噪声填充缓冲区,但我计划用我自己的自定义波形数据填充它。我意识到我很可能用错误的数据类型填充缓冲区,但我无法找到任何有关正确执行方式的文档或示例。任何帮助将不胜感激。

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var frameCount = 2000;
var sampleRate = 4000;
var myBuffer = audioContext.createBuffer(2, frameCount, sampleRate);

// FILL WITH WHITE NOISE
for (var i = 0; i < frameCount; i++) 
    myBuffer[i] = Math.random() * 2 - 1;

sourceNode = audioContext.createBufferSource();
sourceNode.buffer = myBuffer;
sourceNode.connect(audioContext.destination);
sourceNode.start(0);

【问题讨论】:

【参考方案1】:

这将在一个回调方法中合成你的噪音,每次你渲染另一个 BUFF_SIZE 数量的样本时都会调用该方法

var BUFF_SIZE = 2048; // spec allows, yet do not go below 1024 
var audio_context = new AudioContext();
var gain_node = audio_context.createGain();
gain_node.connect( audio_context.destination );
var source_node = audio_context.createScriptProcessor(BUFF_SIZE, 1, 1);

source_node.onaudioprocess = (function() 

    return function(event) 

        var synth_buff = event.outputBuffer.getChannelData(0); // mono for now

        // FILL WITH WHITE NOISE
        for (var i = 0, buff_size = synth_buff.length; i < buff_size; i++) 
            synth_buff[i] = Math.random() * 2 - 1;
        
    ;
());

source_node.connect(gain_node);

【讨论】:

以上是关于填写我自己的网络音频缓冲区不起作用的主要内容,如果未能解决你的问题,请参考以下文章

签名的 16 位 PCM 转换不起作用。为啥?

从 vb.net 提交的网络浏览器不起作用

iOS:音频单元 RemoteIO 在 iPhone 上不起作用

某些音频单元代码(包括 auval)在 iTerm 中不起作用

Xml 音频列表播放器在移动设备上不起作用,并且自动播放不起作用

音频遥控器不起作用