Получение "undefined не является объектом" при сцеплении методов .connect () в Safari - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь связать методы .connect с моим AudioNode.Как и в этом примере: https://googlechrome.github.io/samples/webaudio-method-chaining/

Это работает в Chrome и Firefox, но я получаю «TypeError: undefined не является объектом (оценивающим« source.connect (gainNode) .connect ') »в Safari.Есть ли способ решить эту проблему?

const $audioPlayer = document.querySelector('.audio-player')
const audio = new AudioContext()
const gainNode = audio.createGain()
const source = audio.createMediaElementSource($audioPlayer)
source.connect(gainNode).connect(audio.destination)

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Реализация Safari Web Audio API не только имеет префикс, но, к сожалению, также сильно устарела.Метод connect() всегда возвращает undefined в Safari.

Чтобы ваш пример работал в Safari, вы можете переписать строку 2 и разделить строку 5 на два вызова.

const $audioPlayer = document.querySelector('.audio-player'); // unchanged

const audio = new webkitAudioContext();

const gainNode = audio.createGain(); // unchanged
const source = audio.createMediaElementSource($audioPlayer); // unchanged

source.connect(gainNode);
gainNode.connect(audio.destination);

ЕслиВы хотите написать свой код, как если бы он предназначался для новейшей итерации Web Audio API, которую вы можете использовать в библиотеке.

Я являюсь автором standard-audio-context .Существует также web-audio-api-shim , который также заполняет метод connect().

Чтобы использовать библиотеку стандартизированного аудио-контекста, вам просто нужно добавить оператор импортак вашему коду.

import { AudioContext } from 'standardized-audio-context';

// everything else can be left unchanged
const $audioPlayer = document.querySelector('.audio-player');
const audio = new AudioContext();
const gainNode = audio.createGain();
const source = audio.createMediaElementSource($audioPlayer);

source
    .connect(gainNode)
    .connect(audio.destination);
0 голосов
/ 22 января 2019

Вместо создания

const audio = new AudioContext()

попробуйте использовать этот код:

const audioCtx = new (window.AudioContext || window.webkitAudioContext)();

Это работает в большинстве браузеров.

...