跨年特辑:修改采集卡的EDID,让采集卡的有源信号分辨率匹配实际分辨率

幼刀之小丛雨 发布于 4 天前 2 次阅读


MS2130采集卡作为一款性价比极高的视频采集方案现在已经基本开始大规模的使用了,足够使用的性能和优秀的价格真的是深得我心。同样的MS2109我也在同时使用。但是有一些很明显的痛点令我感到难受。

首先,作为使用非主流的奇葩分辨率的用户我很难受。一方面,我在使用的1366x768的长度数并不是标准整数,需要向下取整为1360x768,这导致了即使是在OBS里面我也不能在标准分辨率选中。另一方面,MS2130的输出档位也不支持1366x768,同样只支持向下取整到1360x768分辨率。当然这段信息与本文无关,只是我想发个牢骚罢了。

其次的痛点就是在默认固件下,这个采集卡的首选分辨率是1920x1080。这很好,毕竟这个采集卡虽然支持4K输入,但也最高只支持到1080p60fps的输出。首选分辨率高了没有意义,缩放到1080p显然能节约性能。但是问题就出在这里了,因为首选分辨率太高了,我在使用低于1080p的小分辨率,理论上采集卡内部会自动缩放到正确的分辨率。但是我手里的这个采集卡商家烧录的固件首选分辨率是1080p,导致我使用小分辨率时,采集卡没有自动对有源信号分辨率进行缩放。

如图所示,采集卡输出的大概就是这个样子的图像,有着非常宽阔的空白区域,我们需要的图像只有中间一点点。为了让采集卡正确进行缩放。我们首先得让Windows系统认为这个采集卡的推荐分辨率是低分辨率。

导出采集卡EDID信息

操作系统如何得知一台显示器支持输出哪些分辨率呢?这之间肯定少不了通信,通过一个叫做EDID的东西相互沟通。

延伸显示能力识别(Extended display identification data,简称EDID)包含显示器分辨率、厂商名称与序号等信息。一般EDID存在于显示器PROMEEPROM

于是思路就变成了怎么去修改采集卡自身的EDID信息,修改采集卡向电脑报告的显示器信息,即可修改首选分辨率。

参考由Asteroid B612编写的这篇修改MS2130/31采集卡显示名称等EDID信息模拟为其他显示器 - Asteroid B612博客文章,使用MS21XX_DownloadTool导出采集卡的固件。

进行任何操作前,请注意备份你的初始固件

使用大佬开发的这个命令行下的自动化工具。

Github-Card

提取固件中的EDID信息。此处假设前一步骤导出的固件名字是Patch.bin。

./ms213x-rename_x86_64.exe -e edid-dump.bin Patch.bin

至此,我们导出了采集卡的edid数据,我们需要使用方便的可视化工具修改它。我也尝试了大佬所示例的软件:EEDitGold (Advantiv EDID Editor - Documents - Video - EngineerZone)编辑完成后却出现了如大佬所说的无法识别显示器音频的问题。发现这个工具处理的EDID貌似是有问题的。这里我使用另外一位大佬的博文hdmi edid 分辨率设置 | 一叶知秋所说的980 Manager里面内置的小工具修改它。这个软件其实是980 HDMI分析测试仪的配套软件,他们的官网Quantumdata的要注册帐号,并且要通过他们的人工审核才能完成帐号注册并且下载这个软件,所以就有点难找。我相信能看到这里的你们一定能够找到这款软件的安装包,认真找还是能找到的。这里我就不附带这个软件的安装包了。

打开980 Manager,如图所示导入edid转储文件。

在Vendor/Product Information段,可以修改EDID的厂商信息,Product Code代表设备型号,Serial Number为显示器序列号。由于Windows操作系统逆天的显示器管理。如果不修改型号和序列号,Windows会认为连接的显示器和之前相同,可能产生识别Bug。毕竟微软也没想到同样的显示器edid还能不相同的。

注意:如果还是出现玄学问题请使用DDU卸载显卡驱动并重新安装,DDU会清除掉所有显示器的连接历史记录。但是显示器的个性化设置可能会丢失。

在Descritpor 4中,可以修改显示器的名字。这里的名字你可以在控制面板和声音设置中看到。同上文所说,由于Windows系统逆天的显示器管理,可能需要同时修改设备型号序列号才能生效。

修改HDMI的推荐分辨率,需要修改Descriptor 1的数据。

如图所示,显示刷新率是通过像素时钟和其他值计算出来的。当然这些值是有标准的,不是乱得来的。这是有一套标准的,叫做DMT(Display Monitor Timing)可以直接查表获得,直接搜索VESA DMT就可以找到这个pdf文档了。通过这个文档可以得知不同分辨率下的显示时序如何填写。

显示时序计算

当然这个显示时序是不用自己亲自填写的,拖动右侧滚动条到最后滚动。这套软件已经内置常见分辨率的显示时序了,直接选择需要的显示时序就自动填写了。我一开始没发现这个功能白白折腾好几个小时。

如果非要手算也可以,一开始我就走了这个弯路。

线数(Lines)这个术语源于显像管显示器的概念,现在的数字显示器还是有些区别的,我毕竟是非专业人士,可能会表达有误

像素时钟的计算公式为

水平总像素数*垂直总像素数*刷新率

或者

(水平像素数+行消隐)*(垂直像素数+场消隐)*刷新率

或者用下面的计算器计算。

像素时钟计算器

注:可以使用Tab键快速在输入框之间切换,

将EDID合成到固件文件

点击右上角按钮,点击Export...导出修改好的edid信息到文件。注意保存的文件格式为.bin

使用前文的工具将edid信息合成到固件中。这里假设修改好的edid信息文件名为edid-mod.bin,修改好的固件文件名为Patch-MOD.bin

./ms213x-rename_x86_64.exe -t edid-mod.bin -o Patch-MOD.bin Patch.bin

将修改完毕的固件写回采集卡

如图所示导入刚才编辑完毕的固件,完成修改。

请重新插拔采集卡让固件生效,此时有源桌面分辨率应该与刚才设置的相同。采集卡也能自动缩放到正确的分辨率了。

EX Stage:解决东方全屏模式下画面被强制拉伸的问题

这里我使用英特尔核显驱动的控制面板示例,将缩放模式调整为保持纵横比,此时会额外出现一个隐藏的复选框为覆盖应用程序设置。勾选后保存退出,此时东方在尝试设置屏幕分辨率时显示区域将强制保持为4:3纵横比,只有中间4:3的区域显示画面。屏幕两侧区域不显示。不会被拉伸成16:9的样式。

如果勾选了保存,会自动取消勾选覆盖应用程序设置。请直接DDU卸载掉显卡驱动重新安装应该就正常了,这是英特尔驱动的一个bug。