- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
ScriptProcessorNode
不适用于 OfflineContext
。
它适用于 Chrome、Mozilla Firefox。
它在 Edge 25、Safari 10 中不起作用。
问题是当处理上下文 OfflineContextis
时事件被调用一次。
关于 jsfiddle 的示例没有 BufferSource
。
关于 jsfiddle 的示例基于MDN example使用 BufferSource
。
console.clear();
var playButton = document.querySelector('.play');
var playButtonOffline = document.querySelector('.play-offline');
var current = 0;
var buffer_size = 4096;
var buffer_length = buffer_size * 10;
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var scriptNode = audioCtx.createScriptProcessor(buffer_size, 1, 1);
scriptNode.onaudioprocess = whiteNoise;
function whiteNoise(audioProcessingEvent) {
console.log('onaudioprocess', current);
// The output buffer contains the samples that will be modified and played
var outputBuffer = audioProcessingEvent.outputBuffer;
// Loop through the output channel
for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
var outputData = outputBuffer.getChannelData(channel);
for (var sample = 0; sample < buffer_size; sample++) {
// add noise to each output sample
outputData[sample] += ((Math.random() * 2) - 1);
}
}
current += buffer_size;
if (current > buffer_length)
scriptNode.disconnect();
}
playButton.onclick = function() {
current = 0;
scriptNode.connect(audioCtx.destination);
}
playButtonOffline.onclick = function() {
var offlineCtx = new(window.OfflineAudioContext || window.webkitOfflineAudioContext)(1, buffer_length, 48000);
var scriptNodeOffline = offlineCtx.createScriptProcessor(buffer_size, 1, 1);
scriptNodeOffline.onaudioprocess = whiteNoise;
current = 0;
offlineCtx.oncomplete = function(e) {
console.log('rendered buffer', e.renderedBuffer.getChannelData(0).filter(f => f != 0).length);
}
scriptNodeOffline.connect(offlineCtx.destination);
offlineCtx.startRendering();
}
<button class="play">
play
</button>
<button class="play-offline">
Render offline
</button>
在 Chrome 和 Firefox 中多次点击 Render offline
会产生相同的输出。
在 Safari 和 Edge 中多次点击 Render offline
会产生不同的输出。
关于 jsfiddle 的示例.
// Create AudioContext and buffer source
console.clear();
var playButton = document.querySelector('.play');
var playButtonOffline = document.querySelector('.play-offline');
var myBuffer = null;
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var source = audioCtx.createBufferSource();
// Create a ScriptProcessorNode with a bufferSize of 4096 and a single input and output channel
var scriptNode = audioCtx.createScriptProcessor(4096, 1, 1);
// load in an audio track via XHR and decodeAudioData
function getData() {
request = new XMLHttpRequest();
request.open('GET', 'https://s3-ap-northeast-1.amazonaws.com/storage.cowrite.decodeapps.io/Materials/Media/Audio/59f2b85dd3aed-20171027-043853.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
myBuffer = buffer;
source.buffer = myBuffer;
},
function(e) {
"Error with decoding audio data" + e.err
});
}
request.send();
}
function addNoise(audioProcessingEvent) {
console.log("onaudioprocess")
// The input buffer is the song we loaded earlier
var inputBuffer = audioProcessingEvent.inputBuffer;
// The output buffer contains the samples that will be modified and played
var outputBuffer = audioProcessingEvent.outputBuffer;
// Loop through the output channels (in this case there is only one)
for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
// Loop through the 4096 samples
for (var sample = 0; sample < inputBuffer.length; sample++) {
// make output equal to the same as the input
outputData[sample] = inputData[sample];
// add noise to each output sample
outputData[sample] += ((Math.random() * 2) - 1) * 0.2;
}
}
}
// Give the node a function to process audio events
scriptNode.onaudioprocess = addNoise;
getData();
// wire up play button
playButton.onclick = function() {
source.connect(scriptNode);
scriptNode.connect(audioCtx.destination);
source.start();
}
// When the buffer source stops playing, disconnect everything
source.onended = function() {
source.disconnect(scriptNode);
scriptNode.disconnect(audioCtx.destination);
}
// When the buffer source stops playing, disconnect everything
// wire up play button
playButtonOffline.onclick = function() {
var offlineCtx = new(window.OfflineAudioContext || window.webkitOfflineAudioContext)(2, myBuffer.length, myBuffer.sampleRate);
var scriptNodeOffline = offlineCtx.createScriptProcessor(4096, 1, 1);
var sourceOffline = offlineCtx.createBufferSource();
sourceOffline.buffer = myBuffer;
sourceOffline.onended = function() {
console.log('sourceOffline.onended');
sourceOffline.disconnect(scriptNodeOffline);
scriptNodeOffline.disconnect(offlineCtx.destination);
}
scriptNodeOffline.onaudioprocess = addNoise;
sourceOffline.connect(scriptNodeOffline);
scriptNodeOffline.connect(offlineCtx.destination);
sourceOffline.start();
offlineCtx.oncomplete = function(e) {
console.log('renderedBuffer', e.renderedBuffer.getChannelData(0).filter(f => f != 0).length);
listenRendered(e.renderedBuffer);
};
offlineCtx.startRendering();
}
var _audioCtx = new(window.AudioContext || window.webkitAudioContext)();
function listenRendered(buffer) {
var _source = _audioCtx.createBufferSource();
_source.buffer = buffer;
_source.connect(_audioCtx.destination);
_source.start();
}
<button class="play">
play
</button>
<button class="play-offline">
Render offline
</button>
最佳答案
这些是 Safari 和 Edge 中的错误。 ScriptProcessorNode 应该可以在离线上下文中正常工作。使用 Safari 和 Edge 提交错误。
关于javascript - ScriptProcessorNode 不适用于 OfflineContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47048141/
我正在尝试在 Dart 中创建一个 Web 音频脚本处理器。我注意到这个问题显示使用“javascriptnode”:ScriptProcessorNode 这似乎不存在于当前的 Dart 版本中。有
我正在研究网络音频随机振荡器,但在使用 scriptProcessorNode 时遇到了问题。我的算法使用随机游走来确定波形中的动态断点,然后在它们之间进行插值。 随着断点在x轴上的移动,我以为振荡波
我有以下 javascript 代码: var audio = null; try { window.AudioContext = window.AudioContext || window.
我正在围绕 scriptProcessorNode 振荡器构建类。我已将 onaudioprocess 事件处理程序包装在函数 Gendy.prototype.process 中。我可以从此包装函数中
我目前正在尝试使用 ScriptProcessorNode 动态降低播放速度。这是我迄今为止编写的代码(仅处理左 channel ): let processor = audioContext.cre
ScriptProcessorNode 不适用于 OfflineContext。 它适用于 Chrome、Mozilla Firefox。 它在 Edge 25、Safari 10 中不起作用。 问题
考虑以下代码: http://jsfiddle.net/LVFa6/ 未调用 ScriptProcessorNode EventHandler process。考虑在最后添加processor.con
目前我有以下代码 AudioContext = window.AudioContext || window.webkitAudioContext; context = new AudioContext
function createAudioMeter(audioContext,clipLevel,averaging,clipLag) { var processor = audioConte
这里是一个简单的 jsFiddle 链接,它使用网络音频测量实时输入的响度(它将值作为百分比输出到控制台)。 http://jsfiddle.net/XSnsF/ 我原计划只有一个输入而没有输出,因为
我正在记录来自用户的麦克风输入并进行处理。问题是我使用scriptProcessorNode来处理数据,但是here它说它已被弃用并替换为 AudioWorklet问题是没有明确的方法可以用 Audi
这里是一个简单的 jsFiddle 的链接,它使用网络音频测量实时输入的响度(它将值以百分比形式输出到控制台)。 http://jsfiddle.net/XSnsF/ 我计划只有一个输入,没有输出,因
我正在尝试获取有关麦克风数据的一些实时数据。所以我将一个 ScriptProcessorNode 连接到我的现场音频的输出,如下所示 (coffeescript): audioSource = nav
我是 html5 新手,我想使用 ScriptProcessorNode 来生成声音。我的问题是这个代码在 iPhone safari 中不起作用。但它可以在桌面上的 Safari 中运行。 var
我正在尝试使用 JavaScript 的 WebAudio API 以及其他一些 SO 文章( How to get frequency from fft result? 、 How do I obt
我正在尝试实现一个具有两个输入 channel 和一个输出 channel 的 ScriptProcessorNode。 var source = new Array(2); source[0] =
Web Audio API 规范声明 ScriptProcessorNode.bufferSize 属性值 "will be picked by the implementation if the b
我是一名优秀的程序员,十分优秀!