|
|
Proxy_Bink32w — Bink视频API代理DLL [v2.0.0]
作者:YoWassup | GitHub:https://github.com/YoVVassup/Proxy_Bink32w
最新版本:v.2.0.0 | 许可证:CC BY-NC-SA 4.0
这是什么?
Proxy_Bink32w 是一个 binkw32.dll 代理DLL,可以拦截游戏与真实Bink视频DLL之间的所有API调用。它作为一个"中间人",在不修改游戏本身的情况下,为 红色警戒2 和 尤里的复仇 提供以下增强功能:
- 视频音轨替换:用自定义WAV/OGG文件替换过场动画的音频
- Full HD视频支持:支持1920×1080分辨率视频,自动保持宽高比缩放到游戏分辨率
- 兼容67个Bink版本:覆盖19个版本组,适用于大量经典游戏
- gamemd.exe → binkw32.dll (代理) → binkw32_1.0q.dll (真实Bink SDK)
复制代码
下载
预配置版本(RA2 + RA2YR 开箱即用):
https://pan.huang1111.cn/s/4R7O4hg
下载包包含:
- RA2YR:11条音频轨道(配音)+ Full HD视频(可自动缩放到更低分辨率)
- RA2:13条音频轨道(配音)+ Full HD视频(可自动缩放到更低分辨率)
- 代理DLL + RA2/RA2YR所需的真实Bink DLL + 预配置 binkw32.cfg
GitHub源码编译:
https://github.com/YoVVassup/Proxy_Bink32w/releases/tag/v.2.0.0
安装步骤
方法一:使用预配置包(推荐)
- 下载预配置包,解压到游戏目录
- 确认 binkw32.dll 和 binkw32_1.0q.dll 都在游戏目录中
- 如果需要替换音轨,将 BinkWAV 文件夹放到游戏目录中
- 编辑 binkw32.cfg 配置音频替换映射(见下方配置说明)
- 启动游戏
方法二:自行编译
环境要求:
- Visual Studio 2022 或更新版本
- CMake 3.28+
编译命令:
- # RA2/RA2YR默认组(Group 5)+ 最佳视频质量(Group 7)
- cmake -B build -G "Visual Studio 17 2022" -A Win32
- cmake --build build --config Release
复制代码
编译完成后,在 build/GROUP_5/Release/ 目录中找到:
- binkw32.dll — 代理DLL
- binkw32_1.0q.dll — 真实Bink DLL
- binkw32.cfg — 配置文件
将 GROUP_5 文件夹中的所有文件复制到游戏目录即可。
音频替换配置
支持的音频格式
| 格式 | 说明 | | WAV | PCM,8/16位,任意采样率,单声道/立体声(最多8声道) | | OGG | Vorbis,任意采样率,单声道/立体声(通过stb_vorbis) |
注意:不支持24位WAV文件。
配置文件 binkw32.cfg
- [exception]
- ; 指定哪些.mix文件需要特殊处理
- 0=movies01.mix
- 1=movies02.mix
- 2=movmd03.mix
- [movies01]
- ; .bik文件名 = 替换音频路径(相对于DLL目录)
- westlogo.bik = BinkWAV\RA2\westlogo.wav
- a00_f00e.bik = BinkWAV\RA2\a00_f00e.wav
- a01_f00e.bik = BinkWAV\RA2\a01_f00e.wav
- a01_p01e.bik = BinkWAV\RA2\a01_p01e.wav
- ; ... 更多映射
- [movies02]
- s01_f00e.bik = BinkWAV\RA2\s01_f00e.wav
- s01_p01e.bik = BinkWAV\RA2\s01_p01e.wav
- ; ... 更多映射
- [movmd03]
- ; 尤里的复仇过场动画
- a00_f00e.bik = BinkWAV\RA2YR\a00_f00e.wav
- a01_f00e.bik = BinkWAV\RA2YR\a01_f00e.wav
- ; ... 更多映射
- [audio]
- ; 全局回退(当exception中未找到时使用)
- ; s01_f00e.bik = BinkWAV\s01_f00e.wav
- [log]
- ; enabled = false ; 禁用日志(默认:true)
- ; wait = true ; 记录BinkWait调用(默认:false)
复制代码
配置优先级
[exception] 段的优先级 高于 [audio]。
当视频打开时,代理首先检查 .mix 归档名是否匹配exception条目,然后在该exception段中查找 .bik 文件名。如果未找到,才回退到全局 [audio] 段。
RA2和RA2YR的.mix文件
| 游戏 | .mix文件 | | 红色警戒2 | movies01.mix(盟军过场)、movies02.mix(苏军过场) | | 尤里的复仇 | movmd03.mix(尤里过场) |
WAV转OGG工具
使用 tools/convert_wav_to_ogg.ps1 批量将WAV转换为OGG Vorbis:
- # 转换当前目录下所有WAV(递归)
- .\tools\convert_wav_to_ogg.ps1
- # 转换指定文件夹
- .\tools\convert_wav_to_ogg.ps1 "C:\path\to\wav\files"
- # 更高质量(0=最差, 10=最佳, 默认=3)
- .\tools\convert_wav_to_ogg.ps1 "C:\path\to\wav" -Quality 5
- # 预览将要转换的文件(干运行)
- .\tools\convert_wav_to_ogg.ps1 "C:\path\to\wav" -DryRun
- # 转换并删除原始WAV
- .\tools\convert_wav_to_ogg.ps1 "C:\path\to\wav" -DeleteOriginal
复制代码
输出示例:
- Found 1022 WAV files, quality=10
- 7wolf\a00_f00e.ogg 41098.5KB -> 10584.9KB (26%)
- ...
- Done: 980 converted, 42 failed
复制代码
Bink版本兼容性
对RA2/RA2YR最重要的两个组
| 组 | Bink版本 | 说明 | | Group 5 | 1.0n-1.0t(5个版本) | RA2/RA2YR默认 — 83个序数,ExpandBink,RADSetMemory | | Group 7 | 1.9q-1.9u(3个版本) | 最佳视频质量 — 73个序数,BinkSetMemory |
- 使用 Group 5 DLL 获得原版播放效果 + 新功能
- 使用 Group 7 DLL 获得改进的色彩校正 + 新功能
完整兼容列表(19组,67个版本)
| 组 | 版本 | 示例游戏 | | 1 | 1.8c-1.8x (12) | Dragon Age Origins, Mass Effect, BioShock, COD MW2/MW3 | | 2 | 1.5e-1.5v (10) | Beyond Good and Evil, XIII, FarCry | | 3 | 1.5x-1.7b (9) | Psychonauts, Evil Genius, RACE On | | 4 | 1.9a-1.9h (5) | PAYDAY The Heist, Mass Effect 2, The Witcher | | 5 | 1.0n-1.0t (5) | RA2 / RA2YR 默认 | | 6 | 1.9i-1.9p (5) | Batman Arkham Asylum, Sleeping Dogs, Borderlands | | 7 | 1.9q-1.9u (3) | 最佳视频质量 | | 8 | 1.0v-1.0x (3) | Fallout Tactics, Red Faction | | 9 | 1.8a-1.8b (2) | Just Cause | | 10 | 1.2i-1.5a (2) | Morrowind, Syberia | | 11-19 | 各1-2个版本 | 各种经典游戏 |
技术原理
工作流程
- 游戏加载 binkw32.dll(我们的代理)到进程
- 首次调用 BinkOpen 时,代理延迟初始化,加载真实Bink DLL
- 所有Bink API函数通过 序数(ordinal) 从真实DLL解析
- 代理导出108个函数存根,通过 __stdcall 函数指针直接转发到真实DLL
.mix归档解析
代理能解析RA2/YR的 .mix 归档格式:
- 头部:4字节保留 + offset 4处的uint16文件计数
- 哈希表:offset 0xA处(每条目12字节:CRC32 + offset + size)
- LMD文件:CRC32 0x366E051F,包含CRC32 → 文件名映射
- CRC32按RA2约定计算:大写 + 填充到4字节对齐
视频缩放
当 BinkCopyToBuffer 的目标缓冲区小于视频分辨率时,代理使用 保持宽高比的适配缩放(类似CSS object-fit: contain)自动缩放帧。使用预计算查找表的最近邻算法,DDraw负责最终屏幕拉伸。
日志
日志文件 binkw32_proxy.log 创建在DLL目录。
在 binkw32.cfg 中配置:
- [log]
- enabled = false ; 禁用所有日志(默认:true)
- wait = true ; 记录BinkWait调用(默认:false)
复制代码
测试
项目包含255个单元测试(Google Test),覆盖31个测试套件:
| 模块 | 测试数 | 覆盖率 | | config.cpp(CRC32、.mix解析器、.bik头、.wav解码器、配置解析器) | 78 | 100% | | binkw32_proxy.cpp(TrackVideo、UntrackVideo、FindVideo、缩放等) | 47 | 100% | | wav_player.cpp(分配、释放、启动、停止、暂停、恢复、跳转) | 35 | 100% | | logging.cpp(Log、LogF、TrimRight、文件轮转) | 1 | 100% | | audio_decoder.cpp(WAV、OGG、负面测试) | 21 | 100% | | 损坏数据测试(畸形.mix、.bik、.wav、配置) | 26 | — | | 集成测试(DLL导出、序数、真实文件) | 13 | — | | 第三方(OGG、WAV、跨格式、.mix) | 15 | — |
常见问题
Q: 安装后游戏无法启动?
A: 确保 binkw32_1.0q.dll(真实Bink DLL)与 binkw32.dll(代理)在同一目录。如果缺少真实DLL,会出现错误对话框。
Q: Group 5 和 Group 7 有什么区别?
A: Group 5是RA2/RA2YR原版使用的Bink版本,Group 7是更新的版本,提供更好的视频质量。两个都可以正常使用。
Q: 如何只替换某个过场动画的音轨?
A: 在 binkw32.cfg 的对应 .mix 段中添加映射,格式为 文件名.bik = 音频路径。
Q: 支持中文配音吗?
A: 支持。只需将中文配音的WAV或OGG文件放到 BinkWAV 目录中,并在配置文件中映射即可。
Q: 日志在哪里?
A: 在游戏目录中的 binkw32_proxy.log 文件。
相关项目
- BikMod — C&C Bink视频模组
- RA2YR-reMIXer — MIX文件解保护工具
- Phobos — TS引擎扩展项目
项目结构
- Proxy_Bink32w/
- ├── binkw32.cfg # 音频替换配置
- ├── Real/ # 原始Bink DLL(67个兼容版本)
- ├── src/
- │ ├── binkw32_proxy.cpp # DLL加载器、视频跟踪、代理导出
- │ ├── config.cpp # 配置解析、.mix解析器
- │ ├── audio_decoder.cpp # WAV + OGG解码器
- │ ├── wav_player.cpp # WaveOut音频播放
- │ ├── ordinals.inc # 自动生成的序数表(19组)
- │ ├── exports.def # DLL导出表(108个导出)
- │ └── stb_vorbis.c # OGG Vorbis解码器
- ├── tests/ # 255个单元测试
- └── tools/
- ├── setup.ps1 # 自动下载工具
- ├── generate_ordinals.ps1 # 自动生成序数表
- └── convert_wav_to_ogg.ps1 # WAV转OGG
复制代码
项目地址: https://github.com/YoVVassup/Proxy_Bink32w
最新发布: https://github.com/YoVVassup/Proxy_Bink32w/releases/tag/v.2.0.0
预配置下载: https://pan.huang1111.cn/s/4R7O4hg |
评分
-
查看全部评分
|