OpenJOC-Browser brings OpenJOC E-AC-3 JOC decoding to Chromium-based web playback through WebAssembly and Web Audio.
The first public release targets Microsoft Edge and Google Chrome. The primary site integration is standard Bilibili VOD when the current account/session exposes an E-AC-3 JOC representation. A local extension player is also available for project-owned .ec3 fixtures and development testing.
Important
OpenJOC-Browser does not provide, crack, or bypass Bilibili Premium or Dolby Atmos access. The current account/session must already be entitled to the audio representation, and the video itself must provide an E-AC-3 JOC track. When those conditions are met, the extension can discover and play the JOC representation without requiring the Dolby Atmos option to be enabled manually in Bilibili's player. It cannot turn an ordinary stereo source into Dolby Atmos.
- OpenJOC WASM decoding of E-AC-3 JOC.
- Bilibili standard VOD detection and bounded CMAF range loading.
- Stereo (Speakers) output and Binaural (Headphones) output.
- Fixed Binaural virtual layout: 7.1.4.
- Built-in SADIE II D1 (KU100) and SADIE II D2 (KEMAR) HRTFs for Binaural mode; D1 remains the default.
- Local Custom SOFA import for compatible SimpleFreeFieldHRIR datasets.
- The Bilibili
<video>remains the video renderer and master clock. - Play, pause, seek, buffering, refresh, and single-page media changes are generation-aware.
- Saved renderer, Dialnorm, always-enable, and custom output-gain preferences.
- Diagnostics for JOC profile, sync drift, buffers, underruns, decode timing, and WASM memory.
The extension package includes both D1 and D2. Either profile is available offline immediately after installation; the selected asset is checked against its packaged size and SHA-256 before use.
Custom SOFA imports local NetCDF classic CDF-1 or NetCDF-4/HDF5 files in OpenJOC's strict SimpleFreeFieldHRIR subset (SOFA conventions 1.0–1.2). The selected HRTF must cover the fixed 7.1.4 virtual layout through exact directions or supported interpolation. Source rates are converted to 48 kHz with a bounded windowed-sinc filter; matching 48 kHz taps are preserved bit-for-bit. Conversion ratios above 16:1 and fractional source delays are rejected. The added common filter delay is included in reported renderer latency.
The WASM importer limits files to 16 MiB, measurements to 4096, source IRs to 8192 taps per receiver, delays to 8192 samples, and the expanded bank to one million coefficients. Oversized HDF5 chunks are rejected before decompression. Imported bytes are checked by SHA-256 and kept in local IndexedDB for later sessions; files are never uploaded.
Bilibili page
-> MAIN-world manifest/media bridge
-> isolated content controller
-> MV3 service worker
-> offscreen AudioContext
-> bounded CMAF fetch and browser transport parsing
-> OpenJOC WASM decoder Worker
-> timestamped AudioWorklet PCM
-> Web Audio output
The browser code handles page integration, media URL policy, ISO-BMFF transport boundaries, lifecycle, and clock alignment. E-AC-3/JOC parsing and rendering remain in OpenJOC. See the architecture guide.
When a GitHub release is available, download its matching OpenJOC-Browser-vX.Y.Z-chromium-standard.zip asset and extract it. The extracted OpenJOC-Browser-vX.Y.Z/ directory is the loadable extension root; use the version from the release asset name.
For Microsoft Edge:
- Open
edge://extensions. - Enable Developer mode.
- Choose Load unpacked.
- Select the extracted
OpenJOC-Browser-vX.Y.Z/directory for that release—the directory containingmanifest.json.
For Google Chrome, use the same steps at chrome://extensions.
The extension is not distributed through the Chrome Web Store or Microsoft Edge Add-ons in this release. To update it, remove or reload the old unpacked directory and load the newly extracted directory. To uninstall, use the browser extension page's Remove action.
See installation for permission details and limitations.
- Open a supported standard Bilibili VOD page.
- Wait for the OpenJOC panel to report that a JOC stream is detected.
- Choose 启用 OpenJOC.
- Select Stereo (Speakers) or Binaural (Headphones) under 输出方式.
- Select Calibrated or Unity / 兼容模式 under 节目电平.
- If needed, open 高级 to inspect diagnostics, change 自定义增益, or switch 语言 between 简体中文, English, and 日本語.
Calibrated follows the programme Dialnorm metadata according to OpenJOC semantics. Unity / 兼容模式 disables Dialnorm attenuation; it is not a volume boost. The custom gain control is separate and ranges from −20 dB to +20 dB in 0.5 dB steps. The panel interface defaults to Chinese; the 语言 / Language selector in 高级 switches every label between Chinese, English, and Japanese and is saved locally.
OpenJOC takes over only after a non-empty in-band JOC profile and usable PCM are confirmed. If it is disabled or fails, the original Bilibili audio is restored with the latest player mute and volume settings.
See usage and diagnostics.
The current implementation targets:
- Microsoft Edge and Google Chrome on Chromium's extension platform.
- Standard Bilibili VOD pages.
- 48 kHz, two-channel output and 1.0x playback.
- Unencrypted, browser-fetchable E-AC-3 JOC CMAF representations.
Safari, Firefox, DRM/encrypted representations, other Bilibili player classes, non-1.0x playback, head tracking, and virtual 9.1.6 are not part of this release. Custom SOFA import is supported for compatible local files. Bilibili availability can vary by account, region, content, and session entitlement. A page title or ordinary E-AC-3 label is not treated as proof of JOC; in-band OpenJOC confirmation is required.
This project does not claim parity with a platform Dolby renderer, identical native Dolby/Apple binaural behavior, lossless reproduction of an authored master, or certification/endorsement by Dolby Laboratories.
The extension reads the current Bilibili page's media identity, playback manifest candidates, video clock, and player mute/volume state only to operate the current session. It does not send audio, diagnostics, or browsing history to an OpenJOC service. It has no analytics, telemetry, account login, or credential collection. Playback preferences are stored in extension storage; a user-selected Custom SOFA file is stored locally in extension IndexedDB and is never uploaded.
Media requests go to Bilibili endpoints needed for the selected session. Signed query strings are not persisted in extension storage or included in diagnostics. Both built-in HRTFs ship with the extension; HRTF selection makes no network request. The extension never loads remote JavaScript or WASM. The exact permissions and data flows are documented in privacy and security.
Prerequisites are Git, Node.js 24.15.0, npm, Rust 1.89 or newer, and the wasm32-unknown-unknown Rust target. The build prefers OPENJOC_ROOT or a neighboring OpenJOC checkout without forcing an older revision; a standalone build uses the OpenJOC v0.20.0 commit in scripts/openjoc-source.json and records its exact commit in openjoc-build-info.json. Set OPENJOC_SOURCE_PIN to a full 40-hex commit SHA to select another exact commit, or explicitly set OPENJOC_SOURCE_REF for a development ref. An explicit pin bypasses a neighboring checkout and is checked against OPENJOC_ROOT when both are supplied.
npm ci
npm run check:version
npm run check:release-policy
npm run check:wasm
npm run check
npm test
npm run build
npm run package:release
npm run validate:releaseThe generated extension is written to extension/. The release ZIP is written to release/. See development for the exact toolchain, parity gates, browser QA, and an explicit local-source override.
This repository consumes the OpenJOC WASM bridge from the separate OpenJOC project. Local builds use the explicitly selected or neighboring source checkout; standalone builds use the reviewed release manifest, or an explicit OPENJOC_SOURCE_REF / full 40-hex OPENJOC_SOURCE_PIN override, and record the resolved commit in build info. OpenJOC is licensed under Apache-2.0.
- Installation
- Usage
- Architecture
- Diagnostics
- Troubleshooting
- Privacy
- Development
- Release engineering
- Third-party notices
OpenJOC-Browser source is available under the Apache License 2.0. OpenJOC-Browser is an independent open-source project. “Dolby”, “Dolby Atmos”, and related marks belong to Dolby Laboratories and are used here only to describe compatibility with media formats or workflows; this project is not affiliated with, endorsed by, certified by, or sponsored by Dolby Laboratories.
OpenJOC-Browser 通过 WebAssembly 和 Web Audio,将 OpenJOC 的 E-AC-3 JOC 解码能力带到基于 Chromium 的网页播放中。
首个公开版本面向 Microsoft Edge 和 Google Chrome。主要的站点集成是标准 Bilibili 视频点播:当当前账号或会话提供 E-AC-3 JOC 表示时,扩展会尝试使用该表示。本地扩展播放器也可用于项目自有的 .ec3 固定测试文件和开发测试。
Important
OpenJOC-Browser 不提供、破解或绕过哔哩哔哩大会员及杜比全景声音质权限。 当前账号或会话必须已经具备相应音质权限,并且视频本身必须提供 E-AC-3 JOC 音轨。满足这些条件时,即使没有在 Bilibili 原播放器中手动开启“杜比全景声”,扩展也可以自动发现并播放该 JOC 音轨;普通立体声音源不会因启用扩展而变成杜比全景声。
- 使用 OpenJOC WASM 解码 E-AC-3 JOC;
- 检测标准 Bilibili 视频点播并进行有界 CMAF 范围加载;
- 支持 Stereo(扬声器)和 Binaural(耳机)输出;
- 双耳模式使用固定的 7.1.4 虚拟扬声器布局;
- 双耳模式内置 SADIE II D1(KU100)和 SADIE II D2(KEMAR)HRTF,D1 仍为默认配置;
- 双耳模式支持导入兼容的本地 Custom SOFA;文件仅保存在扩展 IndexedDB,不会上传;
- Bilibili 的
<video>元素继续负责视频渲染和主时钟; - 播放、暂停、跳转、缓冲、刷新和单页媒体切换均按播放代际处理;
- 保存渲染器、Dialnorm、始终启用和自定义输出增益偏好;
- 提供 JOC 配置、同步漂移、缓冲区、欠载、解码耗时和 WASM 内存诊断信息。
扩展包同时包含 D1 和 D2。安装后两套配置都可立即离线使用;加载前会按包内声明的文件大小和 SHA-256 校验所选资源。
选择 Custom SOFA… 可从本地导入文件。当前支持 NetCDF classic CDF-1 和 NetCDF-4/HDF5 容器中的 SimpleFreeFieldHRIR 子集,SOFA 约定版本为 1.0–1.2。HRTF 必须能精确覆盖固定的 7.1.4 虚拟布局,或在支持范围内插值到这些方向。
浏览器会把 HRIR 转换到 48 kHz。源采样率已是 48 kHz 时,tap 系数逐位保持不变;其他采样率采用有界窗函数 sinc 转换,比例超过 16:1 时拒绝处理。转换会增加两耳共用的因果滤波延迟,并计入延迟报告。分数源延迟仍不受支持。
WASM 导入限制:文件最大 16 MiB、测量点最多 4096 个、每个接收器的原始 IR 最多 8192 个采样点、源 Delay 最多 8192 个采样点、展开后的 HRIR 系数总数最多一百万。HDF5 chunk 还受解压内存预算限制;超限 chunk 会在解压前拒绝。导入数据按 SHA-256 校验,并保存在本机扩展 IndexedDB 中供后续会话使用;文件不会上传。
Bilibili 页面
-> MAIN world 清单/媒体桥接
-> 隔离的 content controller
-> MV3 service worker
-> offscreen AudioContext
-> 有界 CMAF 请求和浏览器传输解析
-> OpenJOC WASM 解码器 Worker
-> 带时间戳的 AudioWorklet PCM
-> Web Audio 输出
浏览器代码负责页面集成、媒体 URL 策略、ISO-BMFF 传输边界、生命周期和时钟对齐。E-AC-3/JOC 的解析与渲染仍由 OpenJOC 负责。详见架构指南。
有可用的 GitHub release 时,请下载对应版本的 OpenJOC-Browser-vX.Y.Z-chromium-standard.zip 并解压。解压后的 OpenJOC-Browser-vX.Y.Z/ 目录就是可加载的扩展根目录;其中已包含 D1 和 D2 两套内置 HRTF。请使用与 release 资产文件名一致的版本。
在 Microsoft Edge 中:
- 打开
edge://extensions。 - 开启“开发人员模式”。
- 选择 Load unpacked。
- 选择该 release 对应版本的
OpenJOC-Browser-vX.Y.Z/目录,也就是包含manifest.json的目录。
在 Google Chrome 中,在 chrome://extensions 执行相同步骤。
此版本不会通过 Chrome Web Store 或 Microsoft Edge Add-ons 分发。更新时,请移除或重新加载旧的未打包目录,再加载新解压的目录。卸载时,请在浏览器扩展页面使用 Remove 操作。
权限详情和限制请参阅安装指南。
- 打开受支持的标准 Bilibili 视频点播页面。
- 等待 OpenJOC 面板报告检测到 JOC 流。
- 选择 启用 OpenJOC。
- 在 输出方式 下选择 Stereo (Speakers) 或 Binaural (Headphones)。
- 在 节目电平 下选择 Calibrated 或 Unity / 兼容模式。
- 如有需要,打开 高级 查看诊断信息、修改 自定义增益,或将 语言 / Language 在 简体中文、English 和 日本語 之间切换。
Calibrated 按照 OpenJOC 的语义使用节目 Dialnorm 元数据。Unity / 兼容模式 会停用 Dialnorm 衰减,但不会提升音量。自定义增益控制独立生效,范围为 −20 dB 至 +20 dB,步进为 0.5 dB。面板默认使用中文;高级 中的 语言 / Language 选择会把所有界面文字切换为中文、英文或日文,并在本地保存该选择。
只有在确认存在非空的带内 JOC 配置并获得可用 PCM 后,OpenJOC 才会接管播放。如果扩展被停用或发生故障,原始 Bilibili 音频会恢复,并沿用播放器最新的静音和音量设置。
当前实现面向以下范围:
- Chromium 扩展平台上的 Microsoft Edge 和 Google Chrome;
- 标准 Bilibili 视频点播页面;
- 48 kHz、双声道输出和 1.0 倍速播放;
- 浏览器可以请求、且未加密的 E-AC-3 JOC CMAF 表示。
Safari、Firefox、DRM/加密表示、其他 Bilibili 播放器类型、非 1.0 倍速播放、头部跟踪以及虚拟 9.1.6 不属于此版本。Bilibili 的可用性可能因账号、地区、内容和会话权限而异。页面标题或普通 E-AC-3 标签不能证明存在 JOC,必须经过 OpenJOC 的带内确认。
本项目不声称与平台 Dolby 渲染器具有等价结果,不声称与原生 Dolby/Apple 双耳行为完全一致,不声称能够无损还原创作母版,也不代表 Dolby Laboratories 的认证或认可。
扩展只读取当前 Bilibili 页面的媒体身份、播放清单候选、视频时钟以及播放器静音/音量状态,用于处理当前会话。它不会向 OpenJOC 服务发送音频、诊断信息或浏览历史,也没有分析、遥测、账号登录或凭据收集功能。播放偏好保存在扩展本地存储中;用户选择的 Custom SOFA 文件仅保存在扩展 IndexedDB 中,不会上传。
媒体请求只发送到当前会话所需的 Bilibili 端点。签名查询字符串不会持久化到扩展存储,也不会写入诊断信息。隐私说明和安全策略记录了完整的权限和数据流。
前置条件:Git、Node.js 24.15.0、npm、Rust 1.89 或更高版本,以及 wasm32-unknown-unknown Rust 目标。构建优先使用 OPENJOC_ROOT 或相邻的 OpenJOC 检出,不会强制绑定较旧版本;独立构建默认采用 scripts/openjoc-source.json 中的 OpenJOC v0.20.0 精确提交,并在 openjoc-build-info.json 中记录精确提交。可用完整的 40 位十六进制 OPENJOC_SOURCE_PIN 选择其他精确提交,或显式设置 OPENJOC_SOURCE_REF 测试开发分支。显式 pin 不会被相邻检出覆盖;同时设置 OPENJOC_ROOT 时会校验其提交。
npm ci
npm run check:version
npm run check:release-policy
npm run check:wasm
npm run check
npm test
npm run build
npm run package:release
npm run validate:release生成的扩展写入 extension/,release ZIP 写入 release/。确切的工具链、平行性检查、浏览器 QA 和显式的本地源码覆盖方式,请参阅开发指南。
本仓库使用独立 OpenJOC 项目的 WASM bridge。本地构建采用明确指定或相邻的源码;独立构建采用已审核的发布源码清单,或显式指定的 OPENJOC_SOURCE_REF / 精确 OPENJOC_SOURCE_PIN,并在构建信息中记录解析出的提交。OpenJOC 采用 Apache-2.0 许可证。
OpenJOC-Browser 源码采用 Apache License 2.0 许可证。OpenJOC-Browser 是一个独立的开源项目。“Dolby”“Dolby Atmos”及相关标志归 Dolby Laboratories 所有,本文仅用于描述与相关媒体格式或工作流的兼容性;本项目与 Dolby Laboratories 没有隶属、认可、认证或赞助关系。