使用Emscripten编译Wasm Audio Worklet时遇SharedArrayBuffer未定义错误
出现Uncaught ReferenceError: SharedArrayBuffer is not defined的核心原因是:当前主流浏览器对SharedArrayBuffer API的启用添加了跨源隔离的强制要求,未满足条件时浏览器会禁用该API,而你当前的运行环境没有满足这个要求。
具体解决步骤:
必须使用HTTP服务器访问,不能直接打开本地HTML文件
直接用file://协议打开生成的worklet.html是无效的,浏览器在本地文件协议下不支持跨源隔离配置,必须通过HTTP服务器访问(如http://localhost:xxxx)。配置必要的HTTP响应头
服务器必须同时返回两个响应头才能启用SharedArrayBuffer:Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp最便捷的方式是使用Emscripten自带的
emrun命令启动测试服务器,它会自动添加这两个响应头:emrun --port 8080 worklet.html之后在浏览器访问
http://localhost:8080/worklet.html即可。确认Emscripten版本
确保你的Emscripten是较新版本,旧版本对Audio Worklet和WASM Workers的支持可能存在兼容性问题,可通过emcc -v检查版本,必要时执行emsdk update && emsdk activate latest更新。
额外说明
你使用的编译命令em++ audioworklet.cpp -sAUDIO_WORKLET=1 -sWASM_WORKERS=1 -o worklet.html本身是符合官方要求的,问题出在运行环境的配置上,而非编译参数错误。
内容的提问来源于stack exchange,提问作者ddgg

