Демоверсия 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 минуты назад, но теперь нет). Я также начинающий программист, и я уверен, что есть гораздо лучшие способы написания кода.

Другие вопросы по тегам