是否可在AudioWorklet内部使用new Function()执行动态生成的音频处理算法?
结论
该方案可行。
实现逻辑
- AudioWorklet运行的独立线程上下文(AudioWorkletGlobalScope)原生支持
new Function动态生成函数的语法,没有默认限制动态代码执行能力 - 你可以通过
AudioWorkletNode.port.postMessage()方法,把编译生成的JS代码字符串从主线程传递到对应的AudioWorkletProcessor实例中 - 在AudioWorkletProcessor的
message事件回调或构造函数内,调用new Function(codeString)生成自定义执行函数,挂载到实例属性后,即可在process()方法中直接调用该函数处理音频数据
注意事项
- 代码字符串通过结构化克隆算法在线程间传递,额外开销极低,不会影响音频渲染性能
- 若你的部署环境配置了CSP(内容安全策略),需要确保规则中放开了
'unsafe-eval'限制,否则new Function的执行会被浏览器拦截 - 节点配置变更时,只需重新传递新的代码字符串,在AudioWorklet内部覆盖原有自定义函数即可,无需重新注册AudioWorkletProcessor
内容的提问来源于stack exchange,提问作者dogefromage
相关产品推荐
相关产品推荐

