内容提要
作者使用绿联UG307-95348(MS2130S芯片)HDMI采集卡时遇到清晰度与颜色问题。清晰度方面,macOS下OBS应选60FPS选项,30FPS版本经MJPEG压缩更糊。颜色方面,采集画面偏亮,因芯片luma processing导致limited range偏移。作者用hidapi工具将寄存器0xfc8e由0x00改为0x11即可修复,并进一步逆向8051固件打补丁持久化该改动,相关代码已开源。
延伸解读
清晰度问题的根源:MJPEG 压缩与带宽限制
文章指出,在 macOS 的 OBS 中选择 60FPS 选项时,采集卡实际输出经过 MJPEG 压缩(从 dmb1 字段可确认),而 30FPS 选项则未压缩。作者推测,压缩版本可能内部以更高分辨率采集再压缩,以通过 USB 5Gbps 带宽;未压缩版本受带宽限制,内部并非真正 4K@30Hz 处理,导致画质损耗。这提醒用户,高帧率选项未必画质更好,需根据实际格式信息判断。
颜色偏移的机制:limited range 与 luma processing
采集画面偏亮,是因为 MS2130S 芯片的 luma processing 导致 limited range(16-235)偏移。例如原始值 200 被显示为 219,244 显示为 255。通过 ffmpeg 观察,采集卡实际输出 204,经 limited range 转换后变为 219。关闭 luma processing(寄存器 0xfc8e 从 0x00 改为 0x11)后,200 变为 199,244 变为 243,偏差极小,问题基本解决。
持久化修复:固件补丁的原理与风险
每次采集后手动运行工具切换寄存器较为麻烦,作者参考 steve-m/ms2130_patcher 对固件打补丁,将两处 MOV R3,#00h 改为 MOV R3,#01h,使复位流程中原本清除 0xfc8e 位 0 和位 4 的操作变为置位,最终寄存器值为 0x11,从而禁用 luma processing。补丁涉及文件偏移 0x1429e、0x142b4 和校验和 0x18033。作者提醒,刷固件有变砖风险,操作前需备份。
Q&A
绿联 UG307-95348 采集卡在 macOS 上 OBS 里选哪个格式才清晰?
在 macOS 上为 OBS 设置采集卡输入时,需要关闭 Use Preset 选项,选择 3840x2160 (16:9) - 30, 60 FPS - CS 709 - NV12 (420v),而不是 3840x2160 (16:9) - 30 FPS - CS 709 - NV12 (420v)。后者明显更糊。
为什么绿联 UG307-95348 采集卡 30FPS 选项比 60FPS 选项更糊?
因为 60 FPS 的那个版本经过了 MJPEG 压缩(从 dmb1 字段可看出),实际分辨率更高,经压缩后可通过 USB 5Gbps 正常传输;而不压缩的 30FPS 版本由于带宽限制,内部不是真正按照 4K@30Hz 处理的,导致画质有损耗。
绿联 UG307-95348 采集卡颜色偏亮、200 变成 219 怎么修复?
颜色偏亮是因为芯片的 luma processing 导致 limited range 偏移。可以通过 hidapi 工具将寄存器 0xfc8e 从 0x00 改为 0x11 来关闭 luma processing,颜色即可恢复正常。修复后 200 变成 199,244 变成 243,偏差很小。
如何用 hidapi 工具临时修复绿联 UG307-95348 的颜色问题?
编译并运行 ugreen_fix_toggle 工具:先安装 hidapi(brew install hidapi),然后编译(cc -O2 -I/opt/homebrew/include/hidapi ugreen_fix_toggle.c -L/opt/homebrew/lib -lhidapi -o ugreen_fix_toggle),运行 ./ugreen_fix_toggle 即可将寄存器 0xfc8e 从 0x00 改为 0x11,关闭 luma processing。再次运行可切换回 0x00。
有没有一劳永逸的方法修复绿联 UG307-95348 的颜色问题?
有,可以给固件打补丁,让硬件启动时自动向 0xfc8e 寄存器写入 0x11 而不是 0x00。具体是修改固件中两处 MOV R3,#00h 指令为 MOV R3,#01h,并更新校验和。相关代码已开源到 jiegec/ugreen-95348-patcher,但操作有变砖风险,需备份固件。
给绿联 UG307-95348 固件打补丁的具体原理是什么?
复位流程中,函数 FUN_CODE_c220() 会通过位掩码辅助函数将 0xfc8e 的 bit 0 和 bit 4 清零。补丁将两处 MOV R3,#00h(7b 00)改为 MOV R3,#01h(7b 01),使每次掩码更新都走置位分支,最终寄存器值变为 0x11,从而禁用 luma processing。同时需要修改代码校验和(0x18033 处 7c 改为 7e)。