не может штрафовать переменную OfflineAudioContext в сафари - PullRequest
0 голосов
/ 06 марта 2019

Я использую веб-аудио API для потоковой передачи аудио на мой удаленный сервер. Я использую OfflineAudioContext. Код прекрасно работает в Chrome и Firefox, но в Safari он выдает вышеупомянутую ошибку при попытке использовать OfflineAudioContext. Я попытался добавить префикс webkit в OfflineAudioContext, затем он дает мне эту ошибку:

SyntaxError: строка не соответствует ожидаемому шаблону.

Я пытался добавить разные значения в конструктор OfflineAudioContext, но он всегда выдавал одну и ту же ошибку.

Я просмотрел страницу разработчиков Mozilla для совместимости с браузером и обнаружил:

enter image description here

Итак, здесь упоминается, что для конструктора OfflineAudioContext совместимость неизвестна для edge и safari. Так вот почему я не могу использовать OfflineAudioContext в сафари? Это еще не поддерживается? или я делаю это неправильно? Или есть другой способ решить это в сафари?

Это первый раз, когда я использую API Web Audio. Итак, я надеюсь, что кто-нибудь может очистить мои сомнения, если я пропустил где-нибудь. Спасибо.

Код OfflineAudioContext добавлен ниже:

let sourceAudioBuffer = e.inputBuffer; // directly received by the audioprocess event from the microphone in the browser

let TARGET_SAMPLE_RATE = 16000;
let OfflineAudioContext =
  window.OfflineAudioContext || window.webkitOfflineAudioContext;
let offlineCtx = new OfflineAudioContext(
  sourceAudioBuffer.numberOfChannels,
  sourceAudioBuffer.duration *
    sourceAudioBuffer.numberOfChannels *
    TARGET_SAMPLE_RATE,
  TARGET_SAMPLE_RATE
);

(если требуется больше кода из файла js, чтобы лучше понять проблему. Просто прокомментируйте ее. Я добавлю это, но я думал, что фрагмента достаточно для понимания проблемы)

1 Ответ

0 голосов
/ 06 марта 2019

Это немного сбивает с толку, но Safari выбрасывает SyntaxError, если ему не нравятся аргументы.И, к сожалению, Safari не нравится широкий диапазон аргументов, которые обычно должны поддерживаться.

Насколько я знаю, Safari принимает только первый параметр от 1 до 10. Это параметр для numberOfChannels. * 1005.*

Второй параметр (length) просто должен быть положительным.

sampleRate может быть числом только от 44100 до 96000.

Однако возможнопереведите все вычисления с 16 кГц в другой sampleRate, который затем работает в Safari.Допустим, это вычисление, которое вы хотели бы выполнить при 16 кГц:

const oac = new OfflineAudioContext(1, 10, 16000);
const osciallator = oac.createOscillator();

osciallator.frequency.value = 400;

osciallator.connect(oac.destination);
osciallator.start(0);

oac.startRendering()
    .then((renderedBuffer) => {
        console.log(renderedBuffer.sampleRate);
        console.log(renderedBuffer.getChannelData(0));
    });

Вы можете сделать почти то же самое при 48 кГц.Только sampleRate будет другим, но channelData визуализированного AudioBuffer будет таким же.библиотека, которая пытается устранить несоответствия между реализациями браузера, я должен упомянуть об этом здесь.:-) Это не поможет с ограничениями параметров в Safari, но, по крайней мере, выдаст ожидаемую ошибку, если параметр выходит за пределы диапазона.

Также обратите внимание, что length не зависит отnumberOfChannels.Если IfsourceAudioBuffer.duration в вашем примере - это длительность в секундах, то вам просто нужно умножить ее на TARGET_SAMPLE_RATE, чтобы получить желаемую length.

...