Buzz на iOS 9.2 с AudioContext (Web Audio API)

Я играл с несколькими различными библиотеками API веб-аудио, и у меня были смешанные результаты. Мой фаворит на данный момент — Timbre.js. Я обычно получаю «жужжание» из динамика на iOS (даже при использовании AudioContextMonkeyPatch). Иногда этого не происходит. Например, перезагрузите телефон, запустите приложение, нажмите кнопку «Перейти», и звук будет таким же (на мой слух), как и в моем настольном браузере. Внесите изменения (например, измените темп) и жужжит, жужжит, жужжит. Однако, как правило, аудиовыход представляет собой гудение, гудение, гудение.

Пример кода:

var freqs = T(function(count) {
  return [220, 440, 660, 880][count % 4];
});

var osc = T("sin", {freq:freqs, mul:0.5});
var env = T("perc", {a:50, r:500}, osc).bang();

var interval = T("param", {value:500}).linTo(50, "30sec");

T("interval", {interval:interval}, freqs, env).start();

env.play();

person Rob Welan    schedule 23.12.2015    source источник


Ответы (1)


Я задал аналогичный вопрос через некоторое время после того, как вы (Искажение в WebAudio API в iOS9?) и считаю, что нашел ответ: Аудио WebKit искажается на iOS 6 (iPhone 5) в первый раз после выключения питания

Резюме: воспроизведите аудиосэмпл с желаемым битрейтом, а затем создайте новый контекст.

// inside the click/touch handler
var playInitSound = function playInitSound() {
    var source = context.createBufferSource();
    source.buffer = context.createBuffer(1, 1, 48000);
    source.connect(context.destination);
    if (source.start) {
        source.start(0);
    } else {
        source.noteOn(0);
    }
};

playInit();
if (context.sampleRate === 48000) {
    context = new AudioContext();
    playInit();
}

Редактирую, чтобы отметить, что, возможно, вам придется немного взломать Timbre.js, чтобы заставить это работать, но, по крайней мере, это сработало для меня при использовании Web Audio самостоятельно.

person trouscaillon    schedule 16.01.2016
comment
Теперь вместо timbre.js используется другая аудиобиблиотека (timbre.js больше не разрабатывается). В промежутках между созданием шума/тишиной я сбрасываю аудиоконтекст. Решение, аналогичное приведенному выше. Я делаю context = new AudioContext();' в качестве команды при нажатии кнопки «остановить звук». - person Rob Welan; 17.01.2016