独立构建的 ttp_enc.dll,实现千千静听的 MP3、WMA 和可选 mp3PRO 编码插件接口。项目结构、日期版本、Release 构建和 Actions 与 ttp_aac、ttp_flac、ttp_ogg、ttp_webm 保持一致,不需要同时构建播放器或其它插件。
| 输出 | 实现 | 模式 |
|---|---|---|
| MP3 | 静态链接 LAME 3.93.1 / 3.101 / 4.0 / 4.1beta1,默认 4.0 | CBR、ABR、V0–V9,以及原有八个预设 |
| WMA | 动态加载系统 wmvcore.dll |
CBR、两遍比特率 VBR、质量 VBR、16 位无损 |
| mp3PRO | 用户提供的 Cool Edit Pro fhtpro.flt |
保留滤镜的编码选项窗口,以本地文件保存配置 |
四个 LAME 版本均从官方固定归档下载并校验 SHA-256,不跟随移动的 latest 链接。历史兼容/对照选项已由 3.93 升级为官方 3.93.1,使用 lame-3.93.1.tar.gz,不宣称完整复刻旧插件的私有构建。该版上游的版本函数仍返回 3.93,MP3 标记仍为 LAME3.93,补丁版身份由归档校验和包版本确认,而非改写上游字符串。4.0 为默认稳定版,4.1beta1 为用户可选的测试版;版本不会自动升级。WMA 使用当前系统实际安装的编码器;mp3PRO 继续使用用户已有的专有滤镜,项目未重建或捆绑其算法内核。
无已有配置时,MP3 默认为 LAME 4.0、CBR 192 Kbps、联合立体声;WMA 默认为 质量 VBR 75。编码器列表显示“MP3 编码器 (LAME)”。MP3 编码选项窗口顶部提供“LAME 版本”下拉框,可选择 3.93.1、3.101、4.0、4.1beta1;确定后保存,取消不修改配置。保留原版字体、独立参数下拉框和原有参数顺序;MP3 的 VBR 分为“原版预设”(八个旧预设)和“质量等级”(V0–V9)两个独立单选项及下拉框,WMA 的 CBR、两遍比特率 VBR、质量 VBR 和 16 位无损在同一窗口选择。已移除独立“扩展…”窗口,已有有效配置保留。
LAME 版本保存在 ttp_enc.ini 的 [LAME] Version:3931=3.93.1、3101=3.101、4000=4.0、4101=4.1beta1。此前的 393 兼容读取为 3.93.1,确定保存后写为 3931,取消或仅编码不改写配置。旧配置没有此键或值无效时使用 4.0,不改变原有码率、VBR 或立体声配置。每个编码实例在打开时固定其版本,后续更改选项不会切换正在编码的内核;不同版本可同时编码。
MP3 保持指定输出采样率。WMA 只接受系统编码器实际支持的参数组合,不会自动替换成近似采样率或低比特率;不支持时需调整播放器转换参数。例如本次 XP/Win7 测试中,质量 75 支持 44.1 kHz,不支持 48 kHz。
MP3/mp3PRO 在播放器中优先使用宿主标准标签接口;独立调用且没有该接口时回退为 ID3v2.3。原版播放器中的 ID3v2、ID3v1+APEv2 写入策略已经实际验证。
关闭播放器,将发行包中的 AddIn/ttp_enc.dll 放入播放器的 AddIn 目录,替换前自行保留原文件备份。
- 四个 LAME 版本均内置,MP3 编码只需要本项目 DLL,不需要外置
lame_enc.dll。 - 使用 mp3PRO 时,把
fhtpro.flt放在同一个 AddIn 目录。无需导入.reg,无需flt.dat,无需安装 Cool Edit Pro。mp3PRO.dll是另一种解码插件,不能代替编码滤镜。 - 缺少
fhtpro.flt时只枚举 MP3 和 WMA;缺少系统 WMA 组件时 WMA 初始化返回错误,MP3 仍可使用。 - 同一 x86 DLL 面向 XP SP3、Windows 7、Windows 10/11;CPU 需要 SSE2。VC-LTL 和 YY-Thunks 在构建时接入,不需要用户另装 VC++ 2012/现代 VC++ 运行库。WMA 需要系统已有 Windows Media 组件。
配置保存在 DLL 同目录的 ttp_enc.ini 与 coolmp3.ini。目录不可写时使用 %APPDATA%\TTPlayer\ttp_enc,不请求管理员权限。不要把运行时配置文件加入发行包。
需要 Visual Studio 2026 C++ 工具链、Windows SDK、CMake 3.24+、Python 3 和 PowerShell。Python 只用于构建后的 PE 导入检查,不是运行依赖。
cd ttp_enc
./build.ps1 -Package默认版本为北京时间 yyyy.MM.dd,同日发行后续版本为 yyyy.MM.ddpN。需要指定版本时:
./build.ps1 -Package -PackageVersion 2026.10.06p1输出:
build/Release/ttp_enc.dll
build/Release/ttp_enc-yyyy.MM.dd[pN].zip
build/Release/SHA256SUMS.txt
ZIP 仅含 AddIn/ttp_enc.dll 和内部 SHA256SUMS.txt;外部校验文件校验 ZIP。作者为 Sonic853,DLL 文件版本、产品版本和包版本同步。四个 LAME 版本共用仓库内的 third_party/lame/COPYING 和 LICENSE;按项目要求仅在仓库保留,不再嵌入 DLL 或另放入 ZIP。对外再分发仍需满足 LGPL 的许可告知、源码和重链接要求;Release 说明提供对应源码和声明链接。
Actions 通过 workflow_dispatch 手动触发。勾选 Release a Version (GitHub) 后,在编译前分配日期版本并发布 GitHub Release;不勾选则只上传构建产物。该工作流只构建 ttp_enc,不构建其它插件,不运行或上传私有测试。
- ABI、工厂顺序、扩展名、原有配置键和编码调用顺序根据原版伪代码及二进制恢复。
- 支持单/双声道 PCM 8/16/24/32 位和 float32/64 输入。当前公共编码路径转换为 16 位 PCM;WMA 无损是对此 16 位数据无损,不保留 24/32 位源文件的全部精度。
- 新 LAME 的压缩结果与旧版内置 LAME 不保证逐字节相同。
- PCM 优化保留重建版既有的 16 位量化语义:浮点非有限值归零、削波、半整数远离零舍入,不修改调用方输入。PCM16 直接复制,其他整数格式使用专用循环,float32/64 使用 SSE2 块转换;每个会话复用有界 PCM/编码缓冲。SIMD 可能改变部分 MP3 码流,不保证与优化前逐字节一致。
- 3.93.1 仍采用当前适配层的输入保护和完整尾部刷新,不模拟旧插件的浮点原地修改、就近偶数舍入或空 Finish。其缺少现代内存标签 API,构建时从原 VBR 标签代码生成仅内存的适配,不改变量化/心理声学算法;受该版上游有符号长度限制,超过 2 GiB 的 ABR/VBR 信息帧收尾明确返回不支持,不静默写入溢出长度。
- 不同版本的同名预设、V0–V9 和算法 quality 数字并非等音质保证。3.93.1 的
vbr_default是旧vbr_rh,不等同于现代版本的 VBR 实现;其官方归档包含相对 3.93 的 ABR/CBR 预设和-q0修复,不额外移植更晚版本的算法。 - 两遍 WMA 用临时文件保存 PCM 分块,内存占用不随歌曲时长增加。第二遍在结束编码时完成,因此该阶段会继续占用时间和临时磁盘空间。
- mp3PRO 滤镜具有全局状态,同一进程同时只能启动一个该滤镜的编码会话;其它请求返回忙碌错误。MP3/WMA 不受此限制。
- 滤镜支持的采样率及编码组合受其原有实现限制。建议通过播放器转换设置使用 44.1/48 kHz;默认立体声 mp3PRO 为 96 Kbps,单声道适配为 48 Kbps,避免旧滤镜悄悄退回普通 MP3。
详见 本次原版行为修复、恢复设计、验证记录 和 第三方来源。
本项目自有适配代码采用 MIT;静态链接的 LAME 及由其标签代码生成的 3.93.1 内存适配采用 LGPL 许可证。完整适配源码与 CMake 脚本保留在仓库,构建时下载四个固定版 LAME 源码;下载目录不原地修改。3.93.1 的构建副本额外生成内存标签函数,规则见 cmake/lame_3931.cmake,不引入旧解码器。各版本使用独立符号前缀和适配层,避免公共 API、内部函数和全局表冲突。可用以下方式替换 LAME 源码并重新生成完整 DLL:
./build.ps1 -BuildDirectory build-relink -Package `
-CMakeArguments '-DFETCHCONTENT_SOURCE_DIR_TTPLAYER_LAME=C:/src/lame-4.0', `
'-DFETCHCONTENT_SOURCE_DIR_TTPLAYER_LAME_3931=C:/src/lame-3.93.1', `
'-DFETCHCONTENT_SOURCE_DIR_TTPLAYER_LAME_3101=C:/src/lame-3.101', `
'-DFETCHCONTENT_SOURCE_DIR_TTPLAYER_LAME_41BETA1=C:/src/lame-4.1beta1'各覆盖目录须包含对应版本的完整源码,构建会核对版本;3.93.1 另检查旧格式的 alpha/beta 字段及包版本,不接受只有 3.93 的目录冒充。3.93.1 标签适配要求对应上游函数布局,布局不支持时明确报错。也可只覆盖需要替换的版本,其余仍自动下载。无需原版 ttp_enc.dll、反编译器或其它插件项目。Release 说明链接到该次构建提交及 LAME 来源、许可证和重链接说明。专有 fhtpro.flt、flt.dat 与原版二进制均不在仓库和发行包内。
DLL 的文件版本和产品版本使用北京时间 yyyy.MM.dd,同日发布补丁使用 pN;
例如 2026.10.06p1 对应固定数字版本 2026.10.6.1。Actions 在编译前确定最终版本,
DLL、发行包和发布标签使用同一版本。各项目继续独立构建。
Release 的基础配置见 cmake/size_release.cmake:
/O1 /Os /Gy /Gw /GF、跨模块优化和链接去除未引用代码/折叠相同代码,关闭 Release 调试信息。
界面和适配层默认 /Ob1;可用 -DTTP_SIZE_INLINE_LEVEL=0|1|2 测量这些代码的内联策略。
四个 LAME 编码库和 PCM 转换热路径单独使用 /O2 /Ob2 /Ot,不再为了减小体积而牺牲编码速度。
3.101/4.0 接入上游 vector/xmm_quantize_sub.c,启用 HAVE_XMMINTRIN_H 与 MIN_ARCH_SSE;4.1beta1 保留上游 SIMD 运行时选择。
默认仍为 LAME 4.0、算法 quality=2,码率、预设和配置不变;保留 /fp:precise、SSE2 基线、异常处理及 VC-LTL/YY-Thunks 的 XP/Win7 兼容配置,不使用 /fp:fast 或全局 AVX2。
Win7 x64 SP1 虚拟机的同参数纯编码对照中,CBR 320 从约 2.373 秒降至 1.044 秒,Fast Standard 从约 1.940 秒降至 0.432 秒(60 秒合成音频、float64 输入、内存输出,包含结束与释放)。这是特定编码工作负载结果,不代表完整播放器转换或所有歌曲的统一倍速;详见验证记录。
Actions 不编译、不运行测试;历史体积测试、多版本回归、性能修复、3.93 及 3.93.1 对照分别保留在本地 rebuild/tests/dll_size_versions、rebuild/tests/enc_lame_versions_20261113、rebuild/tests/enc_speed_fix_20261113、rebuild/tests/enc_lame393_20261113、rebuild/tests/enc_lame3931_20261113,均不进入发行包。