问题标签 [android-virtualdisplay]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
12 浏览

android-virtualdisplay - 如何附加已经创建的虚拟显示器

我使用 createVirtualDisplay() 方法创建了一个虚拟显示器。单击主页按钮并返回后,我需要重新附加已经创建的虚拟显示器。我也得到了 displayID 和表面。但无法显示虚拟显示器。

0 投票
0 回答
62 浏览

android - Android MediaProjection - VirtualDisplay 和 ImageReader 的合适分辨率是多少?

我使用 MediaProjection api 以及 VirtualDisplay 和 ImageReader 来共享屏幕。下面是创建 VirtualDisplay 和 ImageReader 的方法:

并且在 OnimageAvailable 上接收到 rgba 原始字节:

到目前为止,一切都很好,并且框架可以毫无问题地渲染到表面视图上。但事情在这一点上变得有趣:

在此处输入图像描述

将宽高改为640 x 480后,效果好一点:

在此处输入图像描述

但如您所见,共享屏幕的纵横比有问题。最后,当我将宽度和高度更改为 768 * 1366 时,结果在某种程度上可以接受但

在此处输入图像描述

  1. 为什么当我为 Imageريالeader 和 VirtualDisplay 设置设备屏幕的宽度和高度时,共享屏幕损坏了?(对于这个设备:宽度=1080 高度=2400)

  2. 为什么当我设置高度大于宽度时,共享屏幕是好的?

  3. 在上一张图中,共享屏幕并没有覆盖整个目标 SurfaceView。如何为 VirtualDisplay 和 ImageReader 设置覆盖整个 SurfaceView 的分辨率?

0 投票
0 回答
29 浏览

android - 通过捕获 VirtualDisplay 为 MediaCodec 设置正确的时间戳

这是我的设置:

我从 VirtualDisplay 捕获帧到 SurfaceTexture,使用 OpenGL 在纹理本身上绘制一些动画对象并将其发送到 MediaCodec 的输入表面。但是在绘制之后,我必须正确地将时间戳设置为 EGL。我尝试了两种方法:

  1. 设置从 SurfaceTexture 接收的时间戳。当屏幕上有内容更新时,这可以正常工作。一般来说,虚拟显示帧率在 (0 - displayRefresh) 范围内。这导致编码器在等待 SurfaceTexture 更新时可能什么都不做,我无法通过 RTMP 发送编码帧的问题。
  2. 使用通过 const FPS 循环计算的自定义时间戳并不断绘制。由于不正确的视频帧速度,它会导致视频滞后。

我看到了一些技巧,比如在屏幕上设置动画视图来推动 VirtualDisplay 生成帧,但它看起来不是一个好的解决方案。MediaCodec 也有一个标志 - KEY_REPEAT_PREVIOUS_FRAME_AFTER,但它不能完全工作。

在这种情况下正确计算时间戳的正确方法是什么?

0 投票
0 回答
67 浏览

android - 辅助显示器不支持屏幕投影

我有以下设置 Android 设备连接到 2 个物理显示器

我正在尝试在辅助显示器上启动屏幕投影

当我运行上面的代码时,系统弹出一条消息

应用程序不支持在辅助显示器上启动

我正在构建的应用程序具有系统应用程序权限,但仍然没有改善这种情况。

问题

  • 如果应用程序作为系统应用程序运行,是否可以投影辅助显示

  • 如果应用程序作为非系统应用程序运行,是否可以投影辅助显示

  • 是否可以在创建虚拟显示时指定显示 ID

0 投票
1 回答
40 浏览

java - Android - 在 SurfaceView 上显示屏幕录制

我正在开发一个可以记录 Android 设备屏幕内容并将其显示在 SurfaceView 上的应用程序。到目前为止,SurfaceView 是屏幕中间的一个框,当前正在显示整个屏幕的内容,连同它自己,创建一个重复的图像。有没有办法重复隐藏SurfaceView,创建一个虚拟显示,然后用虚拟显示的内容显示SurfaceView?

RecordingSession.java

窗口.java

popup_window.xml

0 投票
1 回答
39 浏览

java - 在android上定义屏幕截图的区域

我目前VirtualDisplay使用 API 进行了设置,该MediaProjectionAPI 被绘制到SurfaceView始终可见的 API 上。然而,VirtualDisplay 正在捕获整个显示,但我希望它只捕获 SurfaceView 覆盖的部分。有什么解决办法吗,不胜感激?

在此处输入图像描述

0 投票
0 回答
69 浏览

java - Android - 实时读取 VirtualDisplay 帧

我正在使用MediaProjectionAPI 捕获我的 Android 设备屏幕,方法是创建一个VirtualDisplay并将其显示在SurfaceView始终可见的 a 上。我想对 VirtualDisplay 抓取的帧进行一些图像处理,然后将它们实时绘制回 SurfaceView。有没有办法使用 VirtualDisplay 和 MediaProjection API 来做到这一点?

RecordingSession.java