【问题标题】:Web audio api stereo panner for multiple audio用于多个音频的 Web 音频 api 立体声平移器
【发布时间】:2021-04-11 06:07:15
【问题描述】:

我添加了控制声音平移的功能,但我无法将所有声音都放入单个缓冲通道。现在我在 github https://mdn.github.io/webaudio-examples/stereo-panner-node/ 上找到了一个项目。这个 github 项目的主要问题是虽然它几乎可以在所有设备上运行,但它只播放一种声音。我尝试使用 queryselectorall 对其进行修改,使其能够处理我网站上的所有噪音,但没有运气。

var audioCtx;
var myAudio = document.querySelectorAll("audio");
var panControl = document.querySelector('.panning-control');
var panValue = document.querySelector('.panning-value');

audioCtx = new window.AudioContext();
var panNode = audioCtx.createStereoPanner();
  
  for (var i = 0; i < myAudio.length; i++) 
{
  source = audioCtx.createMediaElementSource(myAudio[i]);
  source.connect(panNode);
}
  panNode.connect(audioCtx.destination);
 
panControl.oninput = function() {
    panNode.pan.value = panControl.value;
    
  }

以上代码是我修改后的代码。它平移所有音频,但仅适用于有限数量的设备,尤其不适用于手机。当我在某些设备上添加修改后的代码时,没有声音来自音频。帮助我将多个声音添加到单个缓冲区通道中,以便我可以添加平移功能以通过单个滑块/搜索器控制所有声音。

您的帮助将不胜感激。

【问题讨论】:

  • 我认为部分问题在于 WebAudio 并非在所有浏览器中都标准化。我认为p5 sound library 非常适合进行原型设计,也许值得在不同的浏览器上尝试一些示例,以快速了解实现的不同之处。
  • @fdcpp 你能告诉我如何使用 p5 声音来解决我的问题,以选择页面上的所有声音进行平移。我对此完全不知道。如果 webaudio 是问题,为什么 github 代码几乎可以在所有设备上运行。就是想。我的猜测是 queryselectorall 正在制造问题,我找不到解决方法来选择所有声音。
  • 很可能会有几个问题。我建议将其拆分为多个questions.1。尝试将queryselectorall 与问题的音频方面分开,它是否按预期工作。检查兼容性developer.mozilla.org/en-US/docs/Web/API/Document/…(看起来没问题所以可能是代码的另一个方面。
  • 2.您如何同时或一个接一个地播放多个声音。将其与页面上的平移和任何 DOM 代码分开。
  • 3.你如何自动平移,只为一个声音。再次与 DOM 代码分开。检查它是如何跨浏览器工作的

标签: audio html5-audio web-audio-api audiocontext audio-panning


【解决方案1】:

感谢没有帮助的家伙,只是绕着灌木丛打。顺便说一句,我找到了问题的答案。希望它可以帮助其他人。

let audioCtx;
const myAudio = document.getElementsByClassName('allmusic');
const myScript = document.querySelector('script');
const panControl = document.querySelector('.panning-control');
const panValue = document.querySelector('.panning-value');


for(let i = 0; i<myAudio.length; i++){
   myAudio[i].addEventListener('play', () => {

  if(!audioCtx) {
    audioCtx = new window.AudioContext();
  }
  let source = audioCtx.createMediaElementSource(myAudio[i]);
  let panNode = audioCtx.createStereoPanner();
  panControl.oninput = function() {
    panNode.pan.value = panControl.value;
    panValue.innerHTML = panControl.value;
  }
  source.connect(panNode);
  panNode.connect(audioCtx.destination);
 });
}

对于平移控件

<input class="panning-control" type="range" min="-1" max="1" step="0.1" value="0">

音频选择器将选择“allmusic”类的所有音频。你也可以把它当作

const myAudio = document.querySelectorAll('audio');

我刚刚添加了一种不同的方式来选择点击事件的所有元素 享受吧。

【讨论】:

  • 这是一个可靠的答案。唯一的建议是提供随附的 html,甚至可能是一个 jsfiddle
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2022-12-22
  • 1970-01-01
  • 2021-10-16
  • 2021-01-15
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多