问题标签 [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.
android - 防止 MediaProjection 对象在杀死应用程序时丢失
我正在使用 MediaProjection 截屏。这就是我正在做的事情。我使用服务创建了一个覆盖图标。单击覆盖图标时会截取屏幕截图。问题是每当应用程序被按下后退按钮或手动杀死时刷它 MediaProjection 对象丢失。有没有办法维护 MediaProjection 并避免每次应用程序被杀死时请求 MediaProjection。我已经看到了,但我仍然无法做到。
在我的 Mainactivity Onclick 中包含 startActivityForResult ,结果 onActivityResult 如下:
辛格尔顿类如下:
我的覆盖图标句柄的服务类单击如下:
我是 android 新手,很难弄清楚这一点。任何帮助将不胜感激。
android - 在 android 5.0 上使用 MediaProjection api 录制音频时出错
案例 1:我正在开发 VOIP 项目,用户可以使用他们的 android 智能手机进行通话。案例2:同时我还想在设备上录制语音和视频并将其保存在本地sd卡上。
问题是我无法在案例 2 中录制语音。案例 1 工作正常,用户可以互相交谈。对于案例1,我像这样设置“音频源”
如果是 2,我正在设置“音频源”,如下所示:
在“案例 2”中,无法录制语音和视频。可能是什么问题 ?
android - 从我们的应用程序启用 Android 的屏幕投射功能
我正在研究铸造应用程序。我可以使用 chromecast 设备将本地视频从我的应用程序投射到电视上。
现在我想在电视上投射(镜像)完整的安卓手机。我知道 Android 通过在快速设置中使用 Cast 功能将其作为默认功能提供,用户必须明确连接到可用的 Chrome Cast 设备。
我怎样才能在我的应用程序中做同样的事情?我尝试使用 MediaProjection API 来捕获屏幕并保存它。
谁能告诉我如何做到这一点?
android - 如何在方向更改时使用 MediaProjection 处理图像捕获?
我编写了用于使用 MediaProjection 类捕获图像的测试应用程序。
// DisplayManager 标志只是轨迹
并在onImageAvailable(ImageReader reader)
方法中
我试图得到如下图像:
直到现在我还好,当我的应用程序处于横向时我得到了正确的图像。面临的问题是方向变化,我没有得到正确的图像。有时再次变回风景也没有正确捕捉。
我经历了 ImageReader.java 类。没有提到需要处理方向变化。
尝试使用 acquireNextImageNoThrowISE()、acquireNextImage() 但没有用。
是否有人尝试或有可能获得正确的图像方向?
请帮助我获得正确的图像。
android - Android mediaProjection + SurfaceView + 覆盖视图
我想问一下,是否可以通过覆盖视图提高录制屏幕的 FPS。
应用程序的伪结构:
1)AppCompatActivity中的全屏FrameLayout:
2) 使用 SurfaceView 进行相机预览:
3)获取SurfaceView(CameraPreview),将CameraPreview添加到FrameLayout中,放到最前面
MediaProjection.createVirtualDisplay(...)
4) 创建输入表面 + 创建虚拟显示器并通过Next将虚拟显示器渲染到表面,MediaMuxer
用于音频/视频多路复用流。
第3点:问题
当我评论行时:controls.bringToFront();
视频有〜30FPS,但视频中没有覆盖视图。
当我取消注释行时:controls.bringToFront();
视频在视频中有叠加视图,但 FPS 仅为 ~20。
或者
当我禁用CameraPreview
视频有〜30FPS,但没有相机预览。
问题可能与覆盖视图有关。当我在设备的调试模式下启用过度绘制时:请参阅
相机预览过度绘制 1x(紫色)
ImageView 过度绘制 2x(绿色)
TextView 过度绘制 3x(粉红色)
当我在设备上以调试模式启用分析 GPU 渲染时:请参阅
我在绿线 (16ms) 下的所有条。
也许我有一些低效的东西。目标是用相同的 FPS 记录屏幕,有/没有覆盖视图。有可能的?
使用screenrecord
命令和 Hardware Composer 进行测试:
A)启用视图覆盖;启用相机预览:
$ ./adb shell screenrecord --time-limit 10 --bit-rate 6000000 /storage/sdcard1/demo3.mp4
结果是视频文件:1280 x 720;H.264 / AVC;20FPS;比特率:4585 kb/s。
硬件作曲家:
B)禁用覆盖 ( //controls.bringToFront();
),因此仅启用相机预览:
$ ./adb shell screenrecord --time-limit 10 --bit-rate 6000000 /storage/sdcard1/demo4.mp4
结果是视频文件:1280 x 720;H.264 / AVC;30FPS;比特率:6684 kb/s。
硬件作曲家:
C)仅android:id="@+id/frameLayout"
+android:id="@+id/controls"
启用布局;启用相机预览:
$ ./adb shell screenrecord --time-limit 10 --bit-rate 6000000 /storage/sdcard1/demo5.mp4
结果是视频文件:1280 x 720;H.264 / AVC;30FPS;比特率:4280 kbps。
硬件作曲家:
D)仅启用android:id="@+id/frameLayout"
++布局;启用相机预览:结果是视频文件:1280 x 720;H.264 / AVC;20FPS;比特率:2879 kbps。android:id="@+id/controls"
<ImageView ...
$ ./adb shell screenrecord --time-limit 10 --bit-rate 6000000 /storage/sdcard1/demo3.mp4
硬件作曲家:
测试systrace
:(
图像从 1.5 图像组合到高度以获取更多信息。)
F)禁用叠加 ( //controls.bringToFront();
)、相机预览、运行记录:
G)启用覆盖,禁用所有视图上的Alpha,相机预览,运行记录:
警报是关于:
- 低效的视图 alpha 使用:
Setting an alpha between 0 and 1 has significant performance costs, if one of the fast alpha paths is not used.
=> 对于案例 G:我在所有视图上禁用了 alpha。警报已删除,但 FPS 仍为:20。 - 调度延迟:
Work to produce this frame was descheduled for several milliseconds, contributing to jank. Ensure that code on the UI thread doesn't block on work being done on other threads, and that background threads (doing e.g. network or bitmap loading) are running at android.os.Process#THREAD_PRIORITY_BACKGROUND or lower so they are less likely to interrupt the UI thread. These background threads should show up with a priority number of 130 or higher in the scheduling section under the Kernel process.
=> 仍未解决。
但这很有趣,因为当我评论时:(//controls.bringToFront();
案例 F),所以controls
布局在相机预览之后(如果我理解的话),所以位图处理的 alpha 仍然执行,但 FPS 是:30 => 好。
我从比较案例 E/F/G 中看到的差异(比例约为 5 秒):
- 案例 F/G:在 CPU 上工作的东西:4、5、6、7,案例 E 不是。
- in
surfaceFlinger
是应用程序的名称:com.*.pso(这是我的 RecordActivity):
案例 E:184 项,
案例 F:312 项,
案例 G:204 项。
图的项目数相似SurfaceView
。 - 在
/system/bin/surfaceflinger
:命令onDraw()
案例 E:切片:~7000 具有墙壁持续时间:~3300ms,
案例 F:切片:~11000 具有墙壁持续时间:~2300ms,
案例 G:切片:~7800 具有墙壁持续时间:~3400ms。 - 在
/system/bin/surfaceflinger
从Binder_1
到Binder_5
:命令dequeueBuffer
案例 E:切片:~1200 有墙持续时间~3500ms,
案例 F:切片:~2080 有墙持续时间~38ms,
案例 G:切片:~1509 有墙持续时间~3200ms, - in
/system/bin/mediaserver
中IppExecuterThre
的情况与 in 中的情况相似surfaceflinger
。dequeueBuffer
案例 E:切片:282 的墙持续时间约为 3600 毫秒,
案例 F:切片:462 的墙持续时间约为 117 毫秒,
案例 G:切片:304 的墙持续时间约为 3300 毫秒。
因此,从叠加视图中移除 alpha 会稍微提高性能,但不会增加 FPS。
android - ActivityNotFoundException 无法找到显式活动类 MediaProjectionPermissionActivity
我有一个奇怪的问题MediaProjectionManager
。因为一般它可以工作,但在像华为 Y560 这样的设备上我得到这个错误:
android - 从服务启动 ProjectionMedia
我有一个浮动按钮正在使用android.permission.SYSTEM_ALERT_WINDOW
所有窗口进行绘制,我想要完成的是一旦我按下它,我就从ProjectionMedia API
这里开始正在做的事情:
并且MainActivity
我有static MyManager
,所以我可以从服务中访问它,但是一旦我Capture
从Service
应用程序调用它就不会做任何事情,并且没有任何东西,logact
我在这里缺少什么?
android - Android:对显示的所有视图进行截图
我有一个具有以下布局的应用程序
- 表面支架
- 表面视图
- 相机预览
- 查看(傻眼镜)
我想做的就是拍一张照片/快照并查看它,看起来很疯狂/很复杂
我先拍了 SurfaceView 的快照,得到一个黑色方块,看来这个方法不正确
现在我正在使用 MediaProjection / ImageReader?
更新:所以我确实得到了一张带有波浪线的图像,它崩溃了,因为我试图停止 MediaProjection。如前所述,我只想拍一张照片
android - 截取的屏幕截图周围有黑边
我正在关注这个例子:
截屏Android ver >=21
。
该示例的问题是,一旦我截取屏幕截图,在top
, right
&bottom
的Image
.
我看不出问题出在哪里,因为给定的Width
和Height
两者都是正确VirtualDisplay
的Bitmap
,我在这里缺少什么?
android - 21岁以下SDK应用录屏
我试图让我的应用程序具有一个功能:记录自己并写入外部商店并导入到 Youtube。我将 MediaProjection 与 API 21+ 一起使用,它完成了。但是如果我想在较低的设备上录制(我的意思是 SDK 20 或更低的设备),怎么可能?非常感谢