Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0
Posted
技术标签:
【中文标题】Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0【英文标题】:Audio ScriptProcessorNode outputBuffer contains only 0 in Chrome 【发布时间】:2017-06-15 12:07:36 【问题描述】:我正在尝试制作一个音频脚本处理器来处理我的音频,但我无法在 Chrome 中调试它。在 Firefox 上它运行良好,但在 chrome 中我的声音过于强大(很多,我的声卡基本上一直在说全功率,尽管我的音量降低了 40%)。我的主要问题是我无法在 chrome 中调试它,因为我的 outputBuffer 只包含 0,即使在我复制了 inputBuffer 之后也是如此。但不知为何还有声音。我的代码的重要部分:
function processAudio(evt)
var inputBuffer = evt.inputBuffer;
var outputBuffer = evt.outputBuffer;
for (var channel = 0; channel < 2; channel++)
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
for (var i = 0; i < inputBuffer.length; i++)
outputData[i] = inputData[i];
// At this point outputData[i] = 0, but inputData[i] is not 0
// The audio plays normally, so there obviously is something in the outputBuffer
当我在外循环结束设置断点时,可以看到inputData全是数字,而outputData只包含0。我错过了什么吗?
【问题讨论】:
只是出于好奇,可能无济于事,当你记录这些值而不使用断点时你有什么? @Kaiido 有趣,当我记录它们时,值会显示出来。不确定 Chrome 在那里做什么...... 从一些个人测试来看,我认为他们确实在并行线程上运行音频 API。这意味着当中断发生时,脚本处理器中保存的值可能不再存在。但我真的很惊讶 ScriptProcessor 的行为相同。而这一切都只是假设,我从未找到(也没有搜索过)任何可靠的消息来源表明我所说的是真的。 【参考方案1】:好的,我想我知道发生了什么(也许有人可以验证这一点......)。正如@Kaiido 指出的那样,音频 API 似乎在并行线程上运行,这意味着 outputBuffer 只是在一段时间后从音频线程中拉出,只留下 0。如果我这样做(不漂亮,但符合我的目的):
function processAudio(audioProcessingEvent)
var inputBuffer = audioProcessingEvent.inputBuffer;
var outputBuffer = audioProcessingEvent.outputBuffer;
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
for (var sample = 0; sample < outputBuffer.length; sample++)
outputData[sample] = ((Math.random() * 2) - 1) * 0.2;
console.log("first = " + outputData[0]);
// Delay 200ms until the outputBuffer gets pulled
var date = new Date();
var curDate = null;
do curDate = new Date();
while(curDate-date < 200);
console.log("first_delay = " + outputData[0]);
我得到这个结果:
first = 0.060469988733530045
first_delay = 0
first = -0.026373833417892456
first_delay = 0
first = -0.037974122911691666
first_delay = 0
我想我将不得不尝试使用 firefox 或其他工具进行调试。
【讨论】:
以上是关于Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0的主要内容,如果未能解决你的问题,请参考以下文章
scriptProcessorNode.onaudioprocess 无法访问全局变量
ScriptProcessorNode 已弃用。改用 AudioWorkletNode
JavaScript - WebAudio API ScriptProcessorNode InputBuffer getChannelData 精度