如何在OS X中获取显示器EDID?

13

我想获取OS X / macOS中的EDID信息?

看起来它存储在IORegistry中。是否有一种方法可以通过当前的monomac库访问它?我能用标准的interop做到吗,还是需要编写自定义的shim

似乎ioreg命令行也可以访问IODisplay EDID属性,但似乎没有简单的方法来获取设备的缩略列表。


IOKit 还没有被 Xamarin 绑定(请求较少,因此优先级较低)(跟踪问题 https://bugzilla.xamarin.com/show_bug.cgi?id=28503),虽然我已经做了一些绑定,但我发现直接使用 ioreg 命令并解析所需信息要快得多,例如:http://stackoverflow.com/a/31716044/4984832。 - SushiHangover
2
我一段时间前从另一个网站上找到了这个代码(现在通过谷歌可以在多个网站上找到):ioreg -lw0 | grep IODisplayEDID | sed "/[^<]*</s///" | xxd -p -r | strings -6 根据您的最终需求,这应该能帮助您朝正确的方向前进。 - SushiHangover
6个回答

9
很遗憾,没有现成的解决方案。
首先,你需要下载 "edid-decode" 程序。不幸的是,它不能通过 homebrew 下载,所以你需要从 https://git.linuxtv.org/edid-decode.git/https://github.com/timvideos/edid-decode 下载。幸运的是,这只是一个单一的 .c 文件,所以你只需要输入 "make" 命令就行了。(不要在没有编辑 Makefile 中的 bindir 和 mandir 的情况下执行 "make install" 命令)。把结果生成的二进制文件放在你的路径中。
然后执行 ioreg -lw0 -r -c "IODisplayConnect" -d 2 | grep IODisplayEDID 命令(感谢 @Steven),获取所有监视器的 EDID 数据的十六进制形式。
选择其中一个输出,将十六进制字符串复制到剪贴板上,然后执行 pbpaste | edid-decode 命令。

1
完美 - 非常有用的信息。对于担心必须编译 edid-decode 的人来说,只需下载存储库为 zip 文件,解压缩,进入终端中的结果目录并键入“make”即可。就是这样简单。 - WillyC
2
补充一下:您需要在系统上安装一个编译器。如果没有,请先安装Xcode,或者找朋友帮您编译它。 - Edward Falk

3

最近 macOS 的更简单解决方案:

system_profiler -json SPDisplaysDataType  | jq -r '.SPDisplaysDataType[0].spdisplays_ndrvs[]._spdisplays_edid'

这将以十六进制格式提取第一GPU上显示器的EDID。更改索引(“[0]”)为[1][2]等,以获取其他GPU / 显示器的EDID。或者只需删除jq并复制+粘贴在详细输出中找到的十六进制EDID:

system_profiler -json SPDisplaysDataType

依赖于 ioreg 的解决方案都可行,但解析其输出很麻烦,并且可能在将来失效。虽然 Apple 没有对此进行说明,但当使用 system_profiler-json-xml 标志一起使用时,它会输出更多信息,包括我们关心的 edid。
注意:在 system_profiler 上使用 -json 标志是相对较新的。如果您没有 -json 标志,则可以改用 -xml,但无法使用 jq 解析输出:system_profiler -xml SPDisplaysDataType

“jq”默认情况下不可用,但Homebrew有它。第一个命令给了我“null,null”的输出,在第二个命令的JSON输出中根本没有包含任何“_spdisplays_edid”属性。 - Synchro
@Synchro,我的[0]索引可能对你不适用。这取决于你的GPU顺序和哪个显示器正在使用哪个GPU。虽然对于你来说,system_profiler -json SPDisplaysDataType | grep -i edid什么也没有返回吗?如果是这样,你的监视器设置有什么特别之处吗?我很惊讶你无法在ioreg -l | grep "IODisplayEDID"system_profiler中找到EDID!你还可以尝试使用system_profiler -xml SPDisplaysDataType | grep -i -A1 _edid来确保它不起作用。 - Chris
这是一台Mac Studio,所以我只有一个GPU,它肯定是索引0。我已经在我的答案中添加了完整的输出;正如您所看到的,没有EDID,但您可以看到我的显示器具有重复的序列号。 - Synchro
有趣!很抱歉我不能提供太多帮助。惊讶的是它不在这里或 ioreg 中。也许 macOS 对于苹果 GPU 或某些情况下不输出 EDID 数据。就像我注意到我的输出似乎说它正在使用 DisplayPort 与我的 MBP 屏幕通信,而 spdisplays_vendorIntel,而你的是 sppci_vendor_Apple,并且没有提到 DisplayPort。这是我的输出以供比较:https://gist.github.com/varenc/4df0789257c2c3e9cc18d5f8a1b1a445最后一个建议:您可以尝试 SwitchResX(https://www.madrau.com/),看看它的“导出 EDID”按钮是否适用于您。 - Chris

2
for theedid in $(ioreg -lw0 -r -c "IODisplayConnect" -d 2 | grep IODisplayEDID | sed -E "/^.*<(.*)>/s//\1/"); do edid-decode <<< $theedid; done

任何类似edid的内容:

for theedid in $(ioreg -lw0 | grep '<00ffffffffffff' | sed -E "/^.*<(.*)>/s//\1/"); do edid-decode <<< $theedid; done

或者:

ioreg -lrw0 -c "IODisplayConnect" -d2 | sed -nE '/^.*"IODisplayEDID" = <(.*)>/s//edid-decode <<< \1/p'

2

如果您想检查EDID文本,请尝试使用

ioreg -lw0 -r -c "IODisplayConnect" -n "display0" -d 2 | grep IODisplayEDID | sed "/[^<]*</s///" | xxd -p -r | strings -6

2
稍微解释一下会让这个答案更有用。仅仅抛出一个命令行,甚至不能回答问题(不仅是问题标题),几乎没有帮助OP或其他人获得一些见解。 - trapicki
令人烦恼的是,我的 Mac 上有三个显示器,它们全部都被命名为“display0”。 - Edward Falk

1
在 @KTane 的回答基础上,那个代码片段没有显示任何内容,但是这个可以(在 Mac Studio 上运行的 macOS Monterey 12.3):
ioreg -l | grep EDID
    | |   |   |   "DisplayAttributes" = {"SupportsSuspend"=No,"MaximumRefreshRate"=144,"SupportsActiveOff"=No,"PortID"=32,"ProductAttributes"={"ManufacturerID"="SAM","YearOfManufacture"=2018,"SerialNumber"=810889805,"ProductName"="C27JG5x","AlphanumericSerialNumber"="HTOKC02346","LegacyManufacturerID"=19501,"ProductID"=3928,"WeekOfManufacture"=51},"MaxVerticalImageSize"=34,"MaxHorizontalImageSize"=60,"HasHDMILegacyEDID"=No,"Chromaticity"={"Red"={"X"=44352,"Y"=20736},"Green"={"X"=18048,"Y"=43328},"Blue"={"X"=9984,"Y"=4032}},"DefaultColorSpaceIsSRGB"=No,"NativeFormatHorizontalPixels"=2560,"DefaultWhitePoint"={"X"=20544,"Y"=21568,"Gamma"=144179},"SupportsVariableRefreshRate"=No,"AspectRatio"=15,"MinimumRefreshRate"=50,"WhitePoints"=({"X"=20544,"Y"=21568,"Gamma"=144179}),"PreciseAspectRatio"=115652,"ContinuousFrequencySupport"="None","SupportsStandby"=Yes,"NativeFormatVerticalPixels"=1440}

    | |   |   |   "EDID UUID" = "4C2D580F-0000-0000-331C-0104A53C2278"

    | |   |   |   "DisplayAttributes" = {"SupportsSuspend"=No,"MaximumRefreshRate"=144,"SupportsActiveOff"=No,"PortID"=48,"ProductAttributes"={"ManufacturerID"="SAM","YearOfManufacture"=2018,"SerialNumber"=810889805,"ProductName"="C27JG5x","AlphanumericSerialNumber"="HTOKC02337","LegacyManufacturerID"=19501,"ProductID"=3928,"WeekOfManufacture"=51},"MaxVerticalImageSize"=34,"MaxHorizontalImageSize"=60,"HasHDMILegacyEDID"=No,"Chromaticity"={"Red"={"X"=44352,"Y"=20736},"Green"={"X"=18048,"Y"=43328},"Blue"={"X"=9984,"Y"=4032}},"DefaultColorSpaceIsSRGB"=No,"NativeFormatHorizontalPixels"=2560,"DefaultWhitePoint"={"X"=20544,"Y"=21568,"Gamma"=144179},"SupportsVariableRefreshRate"=No,"AspectRatio"=15,"MinimumRefreshRate"=50,"WhitePoints"=({"X"=20544,"Y"=21568,"Gamma"=144179}),"PreciseAspectRatio"=115652,"ContinuousFrequencySupport"="None","SupportsStandby"=Yes,"NativeFormatVerticalPixels"=1440}

    | |   |   |   "EDID UUID" = "4C2D580F-0000-0000-331C-0104A53C2278"

你能发现问题吗?是的,我的两个显示器都有相同的序列号和UUID。三星需要受到惩罚...

更新:

这是system_profiler -json SPDisplaysDataType的完整输出:

{
  "SPDisplaysDataType" : [
    {
      "_name" : "Apple M1 Max",
      "spdisplays_mtlgpufamilysupport" : "spdisplays_metal3",
      "spdisplays_ndrvs" : [
        {
          "_name" : "C27JG5x",
          "_spdisplays_display-product-id" : "f58",
          "_spdisplays_display-serial-number" : "3055324d",
          "_spdisplays_display-vendor-id" : "4c2d",
          "_spdisplays_display-week" : "51",
          "_spdisplays_display-year" : "2018",
          "_spdisplays_displayID" : "4",
          "_spdisplays_pixels" : "2560 x 1440",
          "_spdisplays_resolution" : "2560 x 1440 @ 144.00Hz",
          "spdisplays_main" : "spdisplays_yes",
          "spdisplays_mirror" : "spdisplays_off",
          "spdisplays_online" : "spdisplays_yes",
          "spdisplays_pixelresolution" : "spdisplays_qhd",
          "spdisplays_resolution" : "2560 x 1440 @ 144.00Hz",
          "spdisplays_rotation" : "spdisplays_supported"
        },
        {
          "_name" : "C27JG5x",
          "_spdisplays_display-product-id" : "f58",
          "_spdisplays_display-serial-number" : "3055324d",
          "_spdisplays_display-vendor-id" : "4c2d",
          "_spdisplays_display-week" : "51",
          "_spdisplays_display-year" : "2018",
          "_spdisplays_displayID" : "3",
          "_spdisplays_pixels" : "2560 x 1440",
          "_spdisplays_resolution" : "2560 x 1440 @ 144.00Hz",
          "spdisplays_mirror" : "spdisplays_off",
          "spdisplays_online" : "spdisplays_yes",
          "spdisplays_pixelresolution" : "spdisplays_qhd",
          "spdisplays_resolution" : "2560 x 1440 @ 144.00Hz",
          "spdisplays_rotation" : "spdisplays_supported"
        }
      ],
      "spdisplays_vendor" : "sppci_vendor_Apple",
      "sppci_bus" : "spdisplays_builtin",
      "sppci_cores" : "24",
      "sppci_device_type" : "spdisplays_gpu",
      "sppci_model" : "Apple M1 Max"
    }
  ]
}

你的示例中没有包含实际的EDID信息。也就是说,没有任何内容可以使用edid-decoder进行解析等操作。话虽如此,你可以检查一下我刚刚发布的解决方案是否有效:https://dev59.com/e1oT5IYBdhLWcg3w0B-_#74523869Apple可能已经更改了ioreg的某些内容,这会破坏其他解决方案,但我可以确认我的解决方案在12.3上可行。 - Chris

1
sudo ioreg -l | grep IODisplayEDID

3
请在您的回答中添加一些解释。 - Cray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接