Демоверсия Web Audio API не работает на iOS
В настоящее время я работаю над адаптацией этой демоверсии веб-аудио API для проекта, над которым я работаю, но при тестировании на iPhone звука нет. Он отлично работает на iPad.
Я искал решения и нашел эту тему в Stackru со следующим фрагментом одного из ответов:
Safari на iOS 6 эффективно запускается с отключенным API Web Audio. Он не включит звук до тех пор, пока вы не попытаетесь воспроизвести звук в событии пользовательского ввода (создайте буферный источник, подключите его к месту назначения и вызовите noteOn()). После этого включается звук, и звук воспроизводится неограниченно и так, как должно. Это недокументированный аспект того, как API Web Audio работает на iOS 6 (здесь документ от Apple, надеюсь, они обновят его с упоминанием об этом в ближайшее время!)
Событие пользовательского ввода должно быть событием onclick на кнопке воспроизведения, но оно должно меняться. noteOn()
вместо start()
до сих пор не исправить это.
Обновление: я также пытался связать кнопку воспроизведения с touchend
событие, но безрезультатно.
Вот функция, которая использует noteOn():
function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) {
// Create the note
var voice = context.createBufferSource();
voice.buffer = buffer;
voice.playbackRate.value = playbackRate;
// Optionally, connect to a panner
var finalNode;
if (pan) {
var panner = context.createPanner();
panner.panningModel = "HRTF";
panner.setPosition(x, y, z);
voice.connect(panner);
finalNode = panner;
} else {
finalNode = voice;
}
// Connect to dry mix
var dryGainNode = context.createGain();
dryGainNode.gain.value = mainGain * effectDryMix;
finalNode.connect(dryGainNode);
dryGainNode.connect(masterGainNode);
// Connect to wet mix
var wetGainNode = context.createGain();
wetGainNode.gain.value = sendGain;
finalNode.connect(wetGainNode);
wetGainNode.connect(convolver);
if (iOS) {
voice.noteOn(noteTime);
}
else {
voice.start(noteTime);
}
}
Любые предложения будут ценны. Благодарю.
3 ответа
Я чувствую себя действительно глупо. Очевидно, если у вас iPhone в режиме вибрации, звук не воспроизводится.
Метод start() должен нормально работать без инструкций if else на iOS, если вы вызываете функцию с событием взаимодействия с пользователем. Также измените порядок, в котором вы передаете y и z пантеру, потому что z занимает второе место по какой-то странной причине. Вот рабочий пример, измените его в соответствии с тем, что вам нужно, большинству не нужно, и у меня есть другие, которые используют dom для добавления слушателей событий
<script>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);
oscillator.type = 'sine';
oscillator.frequency.value = 440;
gainNode.gain.value = 1;
</script>
<button onclick="oscillator.start();">play</button>
По моему опыту, иногда API-интерфейс Web Audio работает на iPhone, а иногда нет. Вот страница, которая работала 5 минут назад на моем iPhone 6s; 1 минуту назад это не сработало; теперь это снова!
http://www.stephenandrewtaylor.net/dna-sonification/
Вот еще один, который работает с перерывами; это сработало 2 минуты назад, а теперь нет (анимация работает, просто нет звука).
http://www.stephenandrewtaylor.net/lie-sonification/
Это может быть связано с тем, сколько вкладок открыто в Safari; Вы можете попытаться закрыть некоторые из ваших открытых вкладок (сейчас у меня есть 5 вкладок, включая страницу lie-sonificaton, которая работала 2 минуты назад, но теперь нет). Я также начинающий программист, и я уверен, что есть гораздо лучшие способы написания кода.