Стереопаннер API веб-аудио для множественного аудио

Я добавил функцию управления панорамированием звуков, но не могу поместить весь звук в один буферный канал. Теперь я нашел проект на 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;
    
  }

Приведенный выше код - это мой измененный код. Он обрабатывает все аудио, но работает только с ограниченным количеством устройств, особенно с телефоном. Когда я добавляю измененный код на некоторые устройства, звук не воспроизводится. Помогите мне добавить несколько звуков в один буферный канал, чтобы я мог добавить функцию панорамирования для управления всеми звуками с помощью одного ползунка / поисковика.

Ваша помощь будет оценена по достоинству.


person PRAJ    schedule 05.01.2021    source источник
comment
Я думаю, что отчасти проблема в том, что WebAudio не стандартизирован для всех браузеров. Я думаю, что звуковая библиотека p5 отлично подходит для прототипирования, ее также стоит потратить опробовать несколько примеров в разных браузерах, чтобы быстро увидеть, чем отличаются реализации.   -  person fdcpp    schedule 05.01.2021
comment
@fdcpp, не могли бы вы показать мне, как использовать звук p5 для моей задачи, чтобы выбрать весь звук на странице для панорамирования. Я понятия не имею об этом. Также, почему код github работает почти на всех устройствах, если проблема заключается в webaudio. Просто интересуюсь. Я предполагаю, что queryselectorall создает проблемы, но я не могу найти способ выбрать все звуки.   -  person PRAJ    schedule 06.01.2021
comment
По всей видимости, будет пара проблем. Я бы порекомендовал разбить этот вопрос на несколько вопросов. Попробуйте queryselectorall отдельно от звукового аспекта вопроса, работает ли он должным образом. Проверьте совместимость developer.mozilla.org/en-US / docs / Web / API / Document / (выглядит нормально, возможно, это еще один аспект кода.   -  person fdcpp    schedule 06.01.2021
comment
2. Как воспроизвести несколько звуков одновременно или один за другим. Отделите это от панорамирования и любого кода DOM на странице.   -  person fdcpp    schedule 06.01.2021
comment
3. Как автоматизировать панорамирование только для одного звука. Снова отделитесь от кода DOM. Проверьте, как это работает в браузерах   -  person fdcpp    schedule 06.01.2021
comment
4. Наконец, соедините все вышеперечисленное вместе. Перед склеиванием убедитесь, что каждая деталь работает по отдельности. Если какая-то часть не работает, сведите ее к как можно более простому примеру и. Задайте вопрос на SO   -  person fdcpp    schedule 06.01.2021
comment
Кроме того, если он не работает на устройстве, укажите его версию и версию браузера. При правильной маркировке вы должны привлечь к себе должное внимание   -  person fdcpp    schedule 06.01.2021
comment
@fdcpp для the1. Думаю, это работает во всех браузерах. Для 2. Я использую цикл for, чтобы добавить все аудио на веб-страницу с помощью селектора запросов, подключить их к узлу панорамирования и применить панорамирование ко всем из них. Для 3. Я не делал его сейчас автоматическим для простоты. Скорее я использую тот же искатель, что и в ссылке на код github, которую я дал выше. Проблема все еще возникает. Не могли бы вы просто взять 3 аудио для простоты и подключить их к узлу панорамирования, как в коде GitHub, используя JavaScript или p5. Я пробовал разные источники в Интернете, но не нашел ответа.   -  person PRAJ    schedule 06.01.2021
comment
Вы хотите, чтобы панорамирование каждого звука контролировалось независимо друг от друга, или чтобы все звуки панорамировались одинаково с помощью одного узла?   -  person fdcpp    schedule 06.01.2021
comment
все звуки в одном узле, как я пытался сделать это выше в коде   -  person PRAJ    schedule 06.01.2021
comment
Чтобы уточнить, у вас есть n звуков, которые вы хотите воспроизводить одновременно. Затем вы хотите панорамировать все звуки на один и тот же канал (влево или вправо) с помощью ползунка, но затем также автоматически.   -  person fdcpp    schedule 06.01.2021
comment
прямо сейчас для простоты я пытаюсь сделать это с помощью ползунка, но позже, когда все звуки начнут панорамироваться на всех браузерах, я добавлю функцию для автоматического перемещения ползунка. Мне просто нужен скрипт для выбора всех звуков на странице и панорамирования звуков слева направо или наоборот.   -  person PRAJ    schedule 06.01.2021
comment
Учитывая, что PannerNode принимает только один ввод, у вас есть 2 проблемы, которые нужно решить. 1. Как вы суммируете несколько аудио буферов в один буфер? 2. Как вы управляете панорамированием аудио? Вы решили вторую часть, поэтому ваш вопрос фактически сосредоточен вокруг 1.. Переформулируйте свой вопрос и исключите все, что связано с панорамированием, поскольку это отдельная проблема, тогда вы, надеюсь, получите больше внимания.   -  person fdcpp    schedule 06.01.2021
comment
Вы также можете подключить несколько источников к одному и тому же назначению, каждый источник требует своего PannerNode со всеми PannerNode объектами, принимающими свои параметры из одного и того же входа. Каждый из них - совершенно правильный подход   -  person fdcpp    schedule 06.01.2021
comment
Да, я мог бы это сделать, но в моем браузере 49 звуков, и можно добавить больше. Было бы утомительно, если бы у каждого звука был свой собственный узел панорамирования. Я искал более прямой подход. Также я обновил вопрос. Также я просмотрел ваши ссылки, я тоже видел их раньше, но я не мог многое понять из того, как применить их в моем проекте. Я маленький новичок в api веб-аудио :)   -  person PRAJ    schedule 06.01.2021
comment
Я не понимаю, почему вы не могли создать экземпляр массива объектов PannerNode в for цикле, который имеет длину number_of_audio_sources   -  person fdcpp    schedule 06.01.2021
comment
Кроме того, хорошо быть новичком в материале, но помните, что цель SO - предоставлять вопросы и ответы, которые позволяют сообществу помочь самому себе. В идеале мы должны свести этот вопрос к нескольким вопросам с общим приложением, а не к одному вопросу с очень конкретным приложением.   -  person fdcpp    schedule 06.01.2021
comment
Спасибо за помощь, приятель, но я не понимаю, как это сделать в массиве. Можете ли вы дать небольшую демонстрацию 5 таких звуков (возьмите любое имя) и прикрепите их к узлу panner и создайте для нихMediaElementSource в качестве ответа   -  person PRAJ    schedule 06.01.2021
comment
В этом случае ваш вопрос: как мне создать массив в JavaScript, а затем как мне создать массив объектов в Javascript Опять же, полностью отделите это от аспекта аудио   -  person fdcpp    schedule 06.01.2021


Ответы (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');

Я просто добавил другой способ выбора всех элементов для событий щелчка Enjoy.

person PRAJ    schedule 06.01.2021
comment
Это твердый ответ. Единственная рекомендация - предоставить сопровождающий html, возможно, даже jsfiddle рядом с - person fdcpp; 06.01.2021
comment
внес правку :) - person PRAJ; 06.01.2021