BassMax — 64 位音频增强器 (Clean-room)
版本 1.0.3 · 2026-11 · MIT License
一个从零重写的三段分频动态增强器。一份 DSP 核心驱动三种形态:
| 形态 | 产物 | 场景 | 速度 |
|---|---|---|---|
| DirectShow 滤镜 | bassmax_dshow.ax (184 KB) |
MPC-HC / PotPlayer 实时播放 | 44.1k 184× |
| Chrome 扩展 | bassmax_chrome_v1.0.0.zip |
浏览器标签页实时处理 | 实时 |
| 命令行转码器 | bassmax_cli.exe (283 KB) |
离线批量 / 管道 | 165–210× |
三者共用同一份 bassmax_core.hpp,DSP 一行没改。Chrome 版逐行移植到 AudioWorklet,与 C++ 参考实现做过逐样本比对(相对差 −97 ~ −101 dB);CLI 版直接 #include 同一个头文件,与 DirectShow 版输出偏差 ≤1 LSB。
算法来源:对一个 20 年前的 32 位 Winamp DSP 插件(iZotope 早期的 OctiMax 音频增强器)做「黑盒测量 → 从零重写」——只用输入/输出音频的测量结果反推行为,独立实现等效链路。产物命名 BassMax,与那个商业老插件区分。
原始插件受版权保护(企业作品,中国约 50 年 / 美国 95 年),因此本项目不包含、不反编译、不复制原插件的任何代码或二进制。
baseclasses/的版权:这是 Microsoft DirectShow Base Classes,源自 Windows SDK 样例,文件头保留原始版权声明,未做修改。它按 SDK 条款随项目分发,仅用于构建本滤镜;本项目的 MIT 许可不覆盖这部分代码。
二、DirectShow 滤镜 (MPC-HC / PotPlayer)
构建
1 | cd bassmax_dshow |
要点:编译带 /utf-8(源码含中文注释);链接用 /LD 并 LINK /EXPORT:... 显式导出四个 COM 入口;
仅排除 baseclasses 的 dllentry.cpp(其 DllMain/类厂由我们自己的 dllmain.cpp 提供)。
注册(需管理员)
双击 install.bat(会检查管理员权限、regsvr32 返回码,并回读注册表确认真的写进去了);卸载用 uninstall.bat。
命令行等价:
1 | regsvr32 "bassmax_dshow.ax" |
注册会写入两组内容,缺任一组播放器都”看不见”:
| 位置 | 作用 |
|---|---|
HKCR\CLSID\{C41F7D22-...}(默认值=显示名)+ \InprocServer32(= .ax 绝对路径,ThreadingModel=Both) |
COM 能按 CLSID 创建这个滤镜 |
HKCR\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{C41F7D22-...},含 FriendlyName、CLSID、FilterData(REGFILTER2 v2,merit=MERIT_UNLIKELY,2 个引脚 × {PCM, IEEE_FLOAT}) |
滤镜映射器能枚举到它 —— MPC-HC/PotPlayer 的”添加滤镜”列表就是走 IFilterMapper2::EnumMatchingFilters 枚举的 |
在播放器中使用
- MPC-HC:
选项 → 外部滤镜 → 添加滤镜 → 选择 “BassMax Audio Enhancer”,并勾选“优先/强制”。或播放 → 滤镜里查看已加载。 - PotPlayer:
F5 首选项 → 滤镜 → 音频滤镜 → 添加系统滤镜 → BassMax Audio Enhancer,勾选启用。
滤镜会做透传式变换:输出格式与输入完全一致(不重采样)。支持 LAV Audio Decoder 的全部输出格式:
- 位深:8-bit(无符号)、16-bit、24-bit、32-bit 整数;32-bit / 64-bit 浮点;
WAVEFORMATEXTENSIBLE的 24-in-32 之类按容器位深解析 - 声道:1 ~ 8(单声道 / 2.0 / 5.1 / 7.1)都能接,按声道对(1-2、3-4、5-6、7-8)独立计算;超过 8 声道明确拒绝,不会硬算。
但实际只建议单声道或双声道使用,多声道请先下混成 2.0,原因见下面「多声道素材」 - 采样率:8 kHz ~ 1.536 MHz(覆盖 DSD256 的 1.4112 MHz;DSD512 的 2.8224 MHz 仍拒绝)
多声道素材(5.1 / 7.1):驱动自动限到 60%,但仍建议混缩成 2.0
7.1 文件确实会被这个滤镜处理,但结果不好听,而且是结构上必然的:
- 滤镜按声道对独立处理,7.1 = 4 对 = 4 套检测器 + 4 路限幅,每一对都各自把自己的动态拉到接近满电平
- 耳机 / 立体声输出会把这些声道下混求和,4 路都接近满电平的信号相加 → 远超 0 dBFS
- 限幅器因此反复触发、谐波堆积,听感就是「糊 + 一直顶着上限」
1.0.3 起加了自动保护:输入声道数 > 2 时,驱动自动压到 60%(kBassMaxMultiChDriveCap)。规则:
| 情况 | 生效驱动 |
|---|---|
| 1–2 声道 | 用户设置值,完全不干预 |
| > 2 声道,用户设了 100% | 60% |
| > 2 声道,用户本来就设了 35% | 35%(只压不抬) |
注册表里的值一个字节都不改,切回 2.0 输入立刻恢复你原本的设置;4.0 / 5.1 / 6.1 / 7.1 一律适用。
这只能把过载压下来,不能修好声道配对——5.1 时中置与 LFE 共用一路增益(第 2 对),
大鼓一来对白会跟着伏动。所以正解还是在下混之后、进滤镜之前收成 2.0:
- LAV Audio Decoder(MPC-HC / PotPlayer 常用)→ 属性 →
Mixing→ 勾选Enable Mixing→Output Speaker Configuration选Stereo(2.0),其余保持默认 - 用播放器自带解码器时,找对应的「下混 / 混缩到立体声 / Speaker Configuration = 2.0」选项
- 这样滤镜收到的就是 2.0,和设计目标一致
例外:WAV(PCM)走不到 LAV。 PCM 是未压缩数据,DirectShow 链路里不需要解码器,
播放器会用自己的 PCM 解码器直通到渲染器,LAV Audio 根本不被创建,它的Mixing设置对 WAV 无效。Formats页里的pcm勾选只影响「LAV 被选为 PCM 解码器」的场合。
多声道 WAV 要下混,只有两条路:
- 预先转成 2.0(最省事,一次搞定):
1 ffmpeg -i "5.1.wav" -ac 2 -c:a pcm_s24le "5.1_stereo.wav"- 转成需要解码的格式(AC3 / DTS / AAC 等)让 LAV 真正接管,此时
Mixing才生效顺带:
MixingLayout的枚举是 Mono(0) / Stereo(1) / 4.0(2) / 5.1(3) / 6.1(4) / 7.1(5),
设成 Stereo 后注册表HKCU\Software\LAV\Audio里应当是MixingLayout = 1,
仍然是3就说明选的还是 5.1。
单声道不受此影响:
m_ch == 1时它被当作复制成一对(L = R)处理,检测器看到的就是原始信号,
与「双单声道立体声」完全等价。不过目前只用真实立体声素材验证过,单声道尚未实测。
参数:默认为「爵士乐 + 低音 +2 dB + 高音 +2 dB + 驱动 100%」。全部存在 HKCU\Software\BassMax,共六个字符串值
(Bass / Treble / Drive / Preset / Enabled / TrayIcon),值名固定、可以直接手改;属性页与托盘界面改的就是这一份,多播放器共用。
设置界面(三种入口)
1) 播放器里的标准属性页(DirectShow ISpecifyPropertyPages,属性页 CLSID {C41F7D22-6B18-4A93-8E52-1D7A4F60C9B2},与滤镜同一个 .ax 导出)
- MPC-HC:播放时右键画面 → 滤镜 → BassMax Audio Enhancer,即弹出属性页
- PotPlayer:右键画面 → 滤镜 → 选中该滤镜 → 属性
- 6 个 EQ 预设按钮 + 三个滑块:低音(−12 … +12 dB,100 Hz 低架)、高音(−12 … +12 dB,9 kHz 高架,后置 EQ 不进压缩)、驱动
(0 … 100%:动态增强量 = 向上压缩深度 + 响度补偿;0 = 逐样本旁路,100% 最强) - 改动实时生效(音频线程检测到参数代号变化后重建系数),无需重开文件
2) 右下角托盘图标
- 播放器加载滤镜时自动出现,提示文字 “BassMax 已开启 / 已关闭”
- 左键单击 = 打开/收起设置窗口;右键单击 = 直接切总开关(参数保留)
- 播放器退出 / 滤镜销毁时图标自动移除
- 想彻底不显示:注册表
HKCU\Software\BassMax的TrayIcon改0,400ms 内图标就消失(不用重开播放器;改回1立刻长回来)
3) 播放器没启动时:用系统自带的 rundll32 调 .ax 的导出(不附带任何额外 EXE)
1 | rundll32.exe "bassmax_dshow.ax",BassMaxConfig |
- 弹出的是同一个设置窗口(
IDD_BASSMAX_POPUP),改完立刻写注册表,关窗即退出该进程 - 入口是
.ax自己导出的BassMaxConfig(extern "C" __declspec(dllexport) void CALLBACK(HWND, HINSTANCE, LPSTR, int),即rundll32的标准签名) - 界面和播放器里完全一致:
.ax内嵌了一份 comctl32 v6 清单,独立运行时自己CreateActCtx激活,
再动态加载comctl32.dll(解析到 WinSxS 里的 v6)并SetThemeAppProperties;
同时SetProcessDPIAware关掉 DPI 虚拟化。否则rundll32.exe没有清单,
控件会退回 Win95 经典外观,且整窗被位图拉伸导致字体发虚 - 重复执行不会开出第二个窗口:已在运行的那个会被拉到前台
- 装包时
install.bat会把这条命令直接打印出来,复制即用
正在播放时也能改:滤镜的托盘线程每 400ms 读一遍注册表,
Bass / Treble / Drive / Preset / Enabled / TrayIcon
任何一项被外部改动(手改注册表、从 rundll32 设置窗口写入)都会在一拍内套用,不需要重开文件或重启播放器。
说明:托盘图标由滤镜在播放器进程内创建(独立消息线程)。图标资源是
bassmax.ico(开启)/bassmax_off.ico(关闭)。
三、Chrome / Edge 扩展
实时处理当前标签页的音频。用的是 tabCapture + 离屏文档 + AudioWorklet,不是内容脚本——所以跨域音源(YouTube、B 站、Spotify Web)不会静音,也不受页面 CSP 影响。
安装(未上架应用商店,走开发者模式):
- 下载 Release 里的
bassmax_chrome_v1.0.0.zip并解压 - 打开
chrome://extensions(Edge 是edge://extensions) - 右上角打开「开发者模式」→ 点「加载已解压的扩展程序」→ 选解压出来的目录
- 播放音频后点工具栏图标,选「开始处理」
限制:标签页必须正在发声(静音标签抓不到音轨);关闭扩展或切走标签页即恢复原声。DSP 与 C++ 版逐样本一致(相对差 −97 ~ −101 dB)。
四、命令行转码器
离线批量,单文件 283 KB,/MT 静态链接不依赖 VC 运行库。
1 | :: WAV 进 WAV 出,输出到 music.bmx.wav |
多个 -af 处理(降混、重采样)由 ffmpeg 负责,BassMax 只做音效本身。
五、参与改进
本三件套已在Github开源: https://github.com/louissgd/BassMax
MIT 许可,欢迎 Fork 与 Pull Request。算法效果、多声道处理、跨平台移植这三类改动最有价值,具体流程见 CONTRIBUTING.md。
三条底线:bassmax_core.hpp 是唯一权威实现(改动需同步 DShow 副本与 JS 移植)、改完要跑逐样本比对、不要提交测试素材和二进制产物。
已知短板(欢迎认领):
- 多声道(>2)处理质量 —— 现在建议先下混成 2.0
--drive0–10 分档的感知一致性- 跨平台构建(核心本身与平台无关,缺构建脚本与测试)
test/下的脚本还没有 CI
下载地址:
https://github.com/louissgd/BassMax/releases
百度链接: https://pan.baidu.com/s/1SH_9K22izS_vt9sHO8u6Nw?pwd=fzn4