【问题标题】:Use AudioWorklet within electron (DOMException: The user aborted a request)在电子中使用 AudioWorklet (DOMException: The user aborted a request)
【发布时间】:2018-10-23 02:36:14
【问题描述】:

我正在尝试在我的电子应用程序中使用 AudioWorklet 进行计量等,当在开发模式下执行时工作正常,其中工作集由像 http://localhost:3000/processor.js 这样的快速开发服务器提供服务。 但是,如果我尝试在 prod 模式下运行该应用程序,则该文件将在本地提供,例如 file://tmp/etc/etc/build/processor.js 并且在开发人员控制台中,我什至可以看到该文件正在正确预览,但我收到此错误消息:

Uncaught (in promise) DOMException: The user aborted a request.

我在over here 之前看到有人遇到过类似的问题,但不幸的是我在堆栈溢出方面的声誉还不够高,无法直接发表评论。将 mime 类型更改为 application/javascript 或 text/javascript 的建议听起来不错,但我不知道如何强制电子对特定文件使用特定的 mime 类型。此外,在网络选项卡的开发者控制台中,似乎 chromium 实际上已经为我的 processor.js 假设了一个 javascript 文件。

我已经尝试使用类似的自定义协议加载工作集

protocol.registerStandardSchemes(['worklet']);

app.on('ready', () => {
  protocol.registerHttpProtocol('worklet', (req, cb) => {
    fs.readFile(req.url.replace('worklet://', ''), (err, data) => {
      cb({ mimeType: 'text/javascript', data });
    });
  });
});

然后在添加worklet时

await ctx.audioWorklet.addModule('worklet://processor.js');

不幸的是,这只以这些错误结束,然后是第一个错误

GET worklet://processor.js/ 0 ()
未捕获的错误:您提供的错误不包含堆栈跟踪。
...

【问题讨论】:

    标签: javascript electron web-audio-api


    【解决方案1】:

    如果有人感兴趣,我找到了一个 hacky 解决方案。 为了强制使用 mime 类型的电子/铬,我很高兴我将带有文件 api 作为字符串的 worklet 文件加载,将其转换为具有 mime 类型 text/javascript 的 blob,然后从中创建一个对象 url

    const processorPath = isDevMode ? 'public/processor.js' : `${global.__dirname}/processor.js`;
    const processorSource = await readFile(processorPath); // just a promisified version of fs.readFile
    const processorBlob = new Blob([processorSource.toString()], { type: 'text/javascript' });
    const processorURL = URL.createObjectURL(processorBlob);
    await ctx.audioWorklet.addModule(processorURL);
    

    希望这对遇到同样问题的人有所帮助...

    【讨论】:

    • 很好的答案!我曾经启动一个本地 HTTP 服务器来为具有正确 mime 类型集的音频工作集提供服务,但您的解决方案更容易(并且加载速度明显更快,消耗的资源更少)。
    • 考虑到问题的性质,这对我来说似乎并不是一个很老套的解决方案。它可以工作,而且也不是那么麻烦。
    【解决方案2】:

    如果您使用 webpack 编译源代码,您应该能够为您的自定义工作脚本使用 web-worker loader

    【讨论】:

    • 我猜这不可能,因为 AudioWorklet 不是普通工人。
    猜你喜欢
    • 2021-01-18
    • 2020-08-22
    • 2018-10-02
    • 2022-12-27
    • 1970-01-01
    • 2022-06-17
    • 2020-11-16
    • 2022-12-01
    • 2023-01-22
    相关资源
    最近更新 更多