Unity - 在 Windows 版 Agora 屏幕共享应用中选择屏幕/显示

Posted

技术标签:

【中文标题】Unity - 在 Windows 版 Agora 屏幕共享应用中选择屏幕/显示【英文标题】:Unity - Selecting screen/display in Agora screen sharing app for Windows 【发布时间】:2020-08-31 20:05:52 【问题描述】:

我正在尝试在 Agora 的帮助下在 Unity 中为 Windows 开发屏幕共享应用程序。当我使用 StartScreenCaptureByScreenRect() 函数时,我成功捕获了整个 VirtualScreen 或 主屏幕。我在尝试捕获其他/辅助显示时遇到问题。

我的设置是 2 台 1920x1080 显示器。例如,当我尝试从 System.Windows.Forms 使用 Screen.AllScreens(它应该返回一个包含系统上所有显示器的数组)时,它不会返回两个 1920x1080 显示器,而是返回一个 3840x1080 显示器位置(0, 0) [布局为 primarysecondary ]。

我真正想做的是在 VirtualScreen 中找到每个屏幕/显示器的“坐标”(除了我知道的主要是 (0,0))。 我虽然 Screen 类是我需要的,但它似乎没有我需要的功能。 我做错了什么还是应该改变我的方法?

更新:

我设法获得了每个屏幕的位置和分辨率(x、y、宽度、高度),但我现在遇到了另一个问题。如果屏幕在主屏幕的上方和/或左侧,y 和/或 x 将为负数。然后我实例化一个 Rectangle 以将其传递给 StartScreenCaptureByScreenRect() 并且该函数返回一个无效参数错误。它仅适用于正 x 和 y(如果屏幕位于主屏幕下方和/或右侧)。

这是一个错误还是我遗漏了什么?

【问题讨论】:

我也在尝试这样做。我只设法共享统一编辑器窗口。可以分享你的源代码吗? 很遗憾我不能,但我可以给你一些提示。首先你应该使用 v3 Agora SDK。如果您尝试从 Unity 函数获取显示信息,您将获得有关游戏屏幕的详细信息,您应该使用 System.Windows.Forms.dll 中的 C# 类 Screen 来获取有关您的显示的详细信息。这个类也没有工作,所以我不得不自己实现它,如果你搜索你很可能会在 github 中找到一个实现。毕竟,您将拥有类似 Screen.AllScreens 的内容,它是所有显示器的列表,您将需要每个显示器的 x,y,width,height。 我得到了全屏数据。但在其中看不到 windowId。无论我尝试什么,当我最小化统一窗口时,我都无法共享屏幕。 用你得到的 x,y,width,height 值创建一个 Rectangle 并将其传递给 StartScreenCaptureByScreenRect(),请参阅 Rick Chengs 的答案以供参考。你不需要windowid。 【参考方案1】:

Unity 在这里是不同的。你没有做错任何事。如果您可以获得 3840x1080 的分辨率,那么您非常接近共享第二台显示器。矩形 (1920,0, 1920, 1080) 是您要放置的区域矩形。例如。考虑以下代码:

TestRectCrop(0);  // display 1
TestRectCrop(1);  // display 2

void TestRectCrop(int order)

    // Assuming you have two display monitors, each of 1920x1080, position left to right:
    Rectangle screenRect = new Rectangle()  x = 0, y = 0, width = 1920 * 2, height = 1080 ;
    Rectangle regionRect = new Rectangle()  x = order * 1920, y = 0, width = 1920, height = 1080 ;

    int rc = mRtcEngine.StartScreenCaptureByScreenRect(screenRect,
        regionRect,
        default(ScreenCaptureParameters)
        );
    if (rc != 0) Debug.LogWarning("rc = " + rc);

【讨论】:

感谢您的回答,但我不是在寻找仅适用于这种情况/布局的硬编码解决方案,想象一下,如果我有 4 个显示器,无论布局中的任何分辨率只是向 x 添加偏移量和/或 y 不适用于所有可能的布局。再次感谢。 在尝试与 StartScreenCaptureByScreenRect 共享屏幕时,我只得到一个白框。有什么想法吗? 尝试 mRtcEngine.StartScreenCaptureByScreenRect(default(Rectangle),default(Rectangle),default(ScreenCaptureParameters))。如果你没有得到白屏,你会在哪里传递无效的参数。如果再次出现白屏,则可能是 videosurface 出现问题。 另外确保您更新到最新的 SDK 版本。 3.0.1.72,上周五在 Asset Store 发布。【参考方案2】:

如果您发现此线程并寻找屏幕共享示例,则只是一个更新 - 我们有 an improved example here,请使用它来测试和调整您的桌面屏幕共享实现。

【讨论】:

以上是关于Unity - 在 Windows 版 Agora 屏幕共享应用中选择屏幕/显示的主要内容,如果未能解决你的问题,请参考以下文章

DllNotFoundException:agoraSdkCWrapper 在 macOS 上的 Unity 中使用 Agora

在 Agora.io 视频通话后 Unity VideoPlayer 音频中断

在 Agora 视频通话 SDK 中启动 Unity 应用

Unity Agora API 调用问题

Agora SDK 在 Windows Build 中不工作。 VideoSurface.cs 在更新中总是得到 tmpi = -1

适用于 Unity 的 Agora 视频 SDK 正在冻结 AR 摄像头