`AudioContext().AudioWorklet.addModule()`, как загрузить с помощью `Blob`?

#javascript #audio #web-worker #audiocontext

#javascript #Аудио #веб-рабочий #audiocontext

Вопрос:

Я пытаюсь использовать new AudioContext(). audioWorklet.addModule(URL.createObjectURL(blob)) Load, но консоль выдает сообщение об ошибке: перекрестный исходный код, если это file:// протокол, как использовать audioWorklet ?

Я пытался использовать new Blob([Source Code], {type: 'application/javascript'}); , но все равно выдал ошибку

Однако метод file:// протокола new Worker(URL.createObjectURL(blob)) может быть использован в Chrome.

 const getMp3=()=>{
    // return arrayBuffer
};

const playWorkletStr = async () => {
    let audioContext = new AudioContext();
    let audioBuffer = await audioContext.decodeAudioData(getMp3());

    let bypass = `class Bypass extends AudioWorkletProcessor {
                    process(inputs, outputs) {
                        const input = inputs[0];
                        const output = outputs[0];

                        for (let channel = 0; channel < output.length;   channel) {
                            output[channel].set(input[channel]);
                        }
                        return true;
                    }
                }
                registerProcessor('bypass', Bypass);
                `;
    let blob = new Blob([bypass], {type: 'application/javascript'});

    await audioContext.audioWorklet.addModule(URL.createObjectURL(blob));
    const bypasser = new AudioWorkletNode(audioContext, 'bypass');

    let source = audioContext.createBufferSource();
    source.buffer = audioBuffer;
    source.connect(bypasser).connect(audioContext.destination);
    source.start();
};
document.getElementById('btn').onclick = () => {
    playWorkletStr();
};
  
 <button id="btn">play</button>
<script src="index.js"></script>
  

Ответ №1:

file:// протокол считается перекрестным в Chrome. Это означает, что URI больших двоичных объектов также будут считаться исходными из этого протокола, и ваш worklet откажется компилироваться из сценариев с разными исходными данными.

Чтобы избежать этого, лучше всего запустить локальный сервер на вашем компьютере. Если вы собираетесь заниматься веб-разработкой, это необходимо, и настройка занимает всего несколько минут в зависимости от вашей операционной системы.

Теперь, если вы действительно хотите использовать file:// протокол, вы можете попробовать запустить свой Chrome с --allow-file-access-from-files флагом.

Комментарии:

1. Однако метод » file:// протокола» new Worker(URL.createObjectURL(blob)) может быть использован в Chrome.

Ответ №2:

Я столкнулся с этой проблемой в Chrome, в то время как Firefox, похоже, не блокировал URI blob здесь. Я нашел решение или обходной путь к этой проблеме: простое использование FileReader.readAsDataURL(blob) вместо URL.createObjectURL(blob) , похоже, работает.

Я нашел это обходное решение, когда пытался audioCtx.audioWorklet.addModule("file:///path_to_js") , Chrome показал сообщение об ошибке в консоли:

Доступ к скрипту в ‘file:///path_to_js’ из источника ‘null’ заблокирован политикой CORS: запросы с разными источниками поддерживаются только для схем протоколов: http, data, chrome-extension, edge, https, chrome-ненадежный.

Я увидел data список здесь, поэтому попробовал, тогда это, казалось, сработало.

Однако я не уверен, разрешено ли это в принципе.

     let blob = new Blob([bypass], {type: 'application/javascript'});

    let reader = new FileReader();
    reader.readAsDataURL(blob);
    let dataURI = await new Promise((res) => {
        reader.onloadend = function () {
            res(reader.result);
        }
    });
    await audioContext.audioWorklet.addModule(dataURI);