问题标签 [android-mediaprojection]

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 回答
1411 浏览

android - Android虚拟显示发布不移除显示

我正在使用androidVirtual Display以及Projection Manager 在某些时候,需要停止投影,因此采取了以下操作

surfaceDestroyed与支持虚拟显示器的表面有关。

当需要再次启动 Media Projection 时,如果迭代可用的显示器,之前创建的虚拟显示器仍列为可用显示器之一

如何正确处理虚拟显示的创建和删除?

笔记 :

以下是媒体投影和虚拟显示设置的片段

0 投票
1 回答
791 浏览

android - Android VirtualDisplay.release() 不释放显示

我正在使用androidMediaProjection截屏。截屏后需要停止投影,virtual display应该释放而VirtualDisplay.release()不是释放显示。这是创建显示的代码。

为了停止投影,我打电话sMediaProjection.stop();,这是我的MediaProjectionStopCallback实现。

这是日志猫。

我已经仔细检查过,上述onStop方法被正确调用,如在 logcat 中所见。在我检查可用显示器时释放显示器后onStop,虚拟显示器仍列为可用显示器。It affects the phone display and graphics and I can't play any video and the issue remains even after uninstalling the app untill I restart the phone.我已经检查了这个链接Android virtual display release doesn't remove display并搜索了很多但没有发现任何有用的信息。非常感谢您的帮助。

0 投票
1 回答
1166 浏览

android - 使用 Android Media Projection API 进行可靠的屏幕捕获

我们使用 Media Projection API 的实现工作正常。但是我们在尝试将捕获的图像写入文件时经常会丢失帧。即使所有 io 代码都在单独的线程中执行。

我们想对捕获的帧进行一些在线图像分析,因此我们不能使用 screenrecord 或类似的工具。

有没有办法从本机代码调用 Android Media Projection 方法?以获得更好的性能?

我们甚至尝试在捕获过程中不调用任何 io 操作。直到最后,我们都在记忆中。但是在 30fps 时我们仍然存在丢失帧的问题。我们怎样才能避免呢?

0 投票
2 回答
5372 浏览

android - Android 记录屏幕,但只有特定的“层”/视图

我使用 MediaProjection API 在 Android 中录制屏幕。现在我想知道是否可以创建一个“隐藏”视图,您实际上可以看到但在视频中看不到,因此不应记录该视图。此外,是否可以禁用通知记录甚至通知中心?

那么是否可以像“表面层系统”一样进行配置,从而您可以决定要记录哪一层?

0 投票
0 回答
117 浏览

android - android screenrecord 不适用于演示显示

我尝试screencap了实用程序来截取 hdmi 显示器的屏幕截图,它按预期工作正常。命令是screencap -d 1 /sdcard/print.png

screenrecord 实用程序不适用于非默认显示。

我尝试编辑并重新编译 screenrecord 的源,将显示 id 更改为eDisplayIdHdmi,但它仍然只记录主要显示内容。

谁能解释/指向文档,如何使用 mediaprojection 和 virtualDisplay 来复制主显示层/内容?

0 投票
0 回答
156 浏览

android - VirtualDisplay.Callback onPause 未调用

我正在尝试处理我在此处提到VirtualDisplay的 a所看到的一些计时问题,我决定使用 a来查看它是否可以解决我的计时问题。VirtualDisplay.Callback

唯一的问题是onPause当我打电话时我的回调永远不会收到virtualDisplay.setSurface(null)。该文档指出它应该,但它没有。我的处理程序没有处于紧密循环中,启动时VirtualDisplay.callback会调用其中的其他方法。VirtualDisplay似乎文档不正确。

任何人都知道当表面设置为空时如何调用回调?

0 投票
1 回答
2153 浏览

android - Android 调整 VirtualDisplay 大小

Android 的 MediaProjection API 有一些问题(实际上更多,但这些是更关键的问题)。阅读图形架构并没有真正的帮助,所以我只是想了解我是否跳过了代码流中的某些内容。

让我们假设:

  1. 我有一个专用的 GL 渲染线程,已初始化,并在其上生成了 GL 纹理。我为纹理设置了 WxH 的默认缓冲区大小。

  2. 我使用 GL 纹理创建了一个 SurfaceTexture,并为此表面纹理创建了一个 Surface。

  3. 通过 MediaProjection 创建一个大小为 WxH 的虚拟显示器,并将其表面设置为上述表面。

问题 1:一切正常(全帧正确输入)或不正常(所有帧都是黑色的;或者例如每帧只有一半可见 - 所有帧的一半相同;或者屏幕的某些部分与其他部分重复部分,有时甚至歪斜)。

问题 2:虽然时间花在一些全屏 GL 游戏中,但经过 FIXED 时间(大约 4 分钟)后,所有传入帧都被冻结(例如,我收到“新”帧,但实际上是一个相同的图像) . 用 glReadPixels 阅读可以确认结果 - 问题是,实际显示超出了该帧。强制它“恢复”的唯一方法是调出状态栏或导航栏,它会立即开始向我发送正确的帧。当然,再过4分钟,它又发生了……

问题 3:在 VirtualDisplay 上调用 resize(),在对 GL 纹理也调用 setDefaultBUfferSize() 之后,最终在 90% 的情况下显示问题 #1(黑色/剪切帧,其他屏幕区域的伪影...... )

我在同一个线程中使用 updateTextureImage -> GL 纹理绘制的调用序列,所以我的正常理解是永远不会发生我以某种方式从半满的 GL 缓冲区或其他东西中读取的情况......对吗?

我还通过将 VirtualDisplay 直接渲染到 MediaCodec 的表面(不涉及自定义 GL)来测试这个问题 - 相同的行为。 更新实际上由于 MediaCodec 具有固定大小的创建表面,因此无法重现该错误,因为我们只能调整虚拟显示器的大小,而不能调整编码器的表面大小,因此这不是真正的错误(但即使这样也可以VirtualDisplay 以某种方式相应地调整表面大小)。

我觉得关闭虚拟显示器时有东西泄漏,或者在创建 VirtualDisplay 之间没有正确初始化,因为它不一致。很可能会发生全新的 MediaProjection 屏幕捕获许可,具有全新的虚拟显示器,具有刚刚创建的表面纹理,最终只会给我半切帧......让我有一张大扑克脸。 ..

PS:所有这一切都发生在装有 Android 6.0.1 的 Nexus 6 上。

0 投票
0 回答
241 浏览

android - 来自模拟器中 Android 屏幕捕获的空白 MP4 视频

我一直在尝试从 Android Emulator 捕获屏幕并将其记录到 .mp4 文件中。我采用了创建虚拟显示器并将帧路由到编码器、多路复用视频通道并写入外部存储的标准方法。但是,输出的 .mp4 文件在播放时只是一个空白屏幕。在设备上运行时,相同的代码可以工作。

一个观察结果是BufferInfo.sizefromonOutputBufferAvailable()始终具有恒定值 13 或 2718,这清楚地表明MediaCodec编码器有问题。配置编码器时需要更改一些参数吗?

另一个观察来自 Logcat,它告诉我SoftAVCEncoder在模拟器中运行时使用了 a,这有点表明使用了一些软件编码,但仍然不确定为什么这不起作用。

0 投票
0 回答
653 浏览

android - 通过 Socket 发送输出 Mediaprojection API android

我想通过 Socket 与 pc 共享 android 的屏幕,android 的版本无关紧要。

经过大量搜索后我发现:MediaProjection.createVirtualDisplay to ImageReader to Bitmap 并通过 Socket Network 发送。你怎么看?

它给出一个黑框和这个错误:

我走过这个这个这个

在这里我定义 ImageReader:

ImageReader 到位图:

我也试过这个,但没有奏效:

通过Socket发送位图,如果我从drawable读取位图,它就可以工作:

欢迎任何建议,谢谢 如果您有其他方式通过互联网与 PC 共享屏幕也将受到欢迎。

0 投票
0 回答
997 浏览

android - Android MediaProjection 性能改进

我想问一下,是否可以提高 MediaProjection.

在流行答案后编辑。

应用程序的伪结构:

1)AppCompatActivity中的全屏FrameLayout:

2) 使用 SurfaceView 进行相机预览

3) 将相机预览添加到 FrameLayout

4)创建输入表面:

5)创建虚拟显示器并将虚拟显示器渲染到Surface。

6)MediaMuxer用于音频/视频多路复用流。

例如,10 秒。录音:

这是〜20 FPS。

我想要30 FPS。(设备可以以 30 FPS 录制全高清,所以我认为这是可能的。)

我尝试从 Android Studio 2.0 录制屏幕,并且对于:
宽度:720 像素
高度:1280像素
比特率:8Mbps
的视频仍然是 20 FPS。

在华为荣耀 4C、Android 5.1.1 ~20 FPS 上测试。
在 Vodafone Smart Ultra 6、Android 5.1.1 上进行了测试,视频具有 ~40 FPS。

我尝试使用 TinyDancer来测量 FPS,它在录制过程中显示 60 FPS。

哪里可能是弱点?录制期间的 CPU 使用率 < 10%。

另外问题:Android 6 中的 MediaProjection 性能更好吗?

(注意:我用叠加视图记录相机预览。)