迷你盖
Minicap为流出Android设备的实时屏幕捕获数据提供了套接字接口. 其用意是作为一个更大的方案的组成部分,因此仅靠它本身并不十分有用。 例如,它被用于 工作队 用于远程控制.
启动后, Minicap 工作不会有根 亚行 在SDK 28(Android 9.0)和下方。 我们建造的最低SDK水平为9(即Android 2.3). 迷你卡普也从事Android Wear. 开发者预览一般在Google发布该发布版本的源代码后得到支持. 只有最新的"开发者预览"被支持,并且直到有稳定的发布. 不支持模拟器 。 注意Android 3.x不支持,因为这些版本从未被开源.
为了捕获屏幕,我们目前使用两种方法。 对于更古老的Android版本,我们使用ScreenshotClient,一个在AOSP的私人API. 对于更新的版本,我们使用虚拟显示,这也需要访问私人API. 然后使用 SIMD 启用的框架编码 蓝色涡轮 并发送了套接字接口。 今后计划进行的改进,以允许更高的FPS,是使用Media Record和朋友来利用硬件编码.
原则上,每个装置都应该起作用. 然而,由于迷你卡普依赖于私人API,因此有些可能不会. 请让我们知道 一个关于这个设备的GitHub问题.
该项目由两部分组成。 有主要的二进制可以单独使用NDK来建造. 另一部分是共享库,为AOSP源树内每个SDK级别和每个建筑所建. 我们在此repo中运送了预编译的库,但对这些共享库使用的代码的任何修改都需要针对相应的AOSP分支进行再编译. 这可能是一个重大的痛苦,但我们有几个公用事业可以帮助解决苦难。 如果你有兴趣的话, 在此读取构建指令。 。 。 .
共享库被冻结在SDK 30(Android 11)和以下. 在较新的Android版本中,请使用小头顶 apk 页:1 相反,它通过 app_process 并且不需要共享库. 工作队 选择自动高于 SDK 30 .
特征
- 视设备而定,可用于非常平滑的FPS. 运行一个旧版Android的更老更弱的设备可以达到10-20 FPS. 运行Android最新版本的更新型设备通常可以相当容易地达到30-40 FPS,但有一些例外. 对于最大FPS,我们建议运行 迷你盖在一半真正的垂直和水平分辨率.
- 体面且可用但非零延迟. 根据编码性能和USB传输速度,它可能是物理屏幕后方一到几个帧.
- 在Android 4.2+上,帧只有在屏幕上出现变化时才会被发送. 在更古老的版本框上作为恒流发送,无论是否有变化.
- 简单套接字接口 .
所需资源
大楼
我们包括 作为 Git 子模块的 libjpeg- turbo所以首先确定你已经拿了.
git submodule init
git submodule update
你现在可以继续了.
所需建筑 印度,并已知至少与NDK修订版10e(2015年5月)合作. 旧版本因缺乏 .asm x86 64 的文件支持 . 重要注意:NDK 15不再早于SDK 第14级支持Android平台. 这意味着如果编译于NDK 15或后期,二进制可能或不会在更早的平台上工作(如Android 2.3,Android 2.3.3).
这么说来,这只是一个问题 引用 ndk-build。 。 。 .
ndk-build
你现在应该有二进制了 ./libs。 。 。 .
如果你修改了共享库,你还需要 盖起它。 。 。 .
运行
你需要这样 构建 先说.
简单的方式
然后可以使用包含 运行。 sh 在设备上运行右二进制的脚本 。 这将确保正确的二进制和共享库被复制到您的设备中. 如果您有多个设备连接, 设置 ANDROID_SERIAL 在运行脚本之前.
# Run a preliminary check to see whether your device will work
./run.sh autosize -t
# Check help
./run.sh autosize -h
# Start minicap
./run.sh autosize
这个 autosize 命令用于自动选择正确的屏幕大小。 这是由脚本而不是二进制本身完成的. 为了了解为什么有必要这样做,请阅读以下的手册说明.
最后,我们只需要建立一个本地的前进,以便我们能够连接到插座.
adb forward tcp:1313 localabstract:minicap
现在你可以连接到1313港的接头了.
那就看一看吧 说吧 Then just see 使用量 见下文.
艰难的路
要手动运行, 您必须首先找出您的设备支持的 ABI :
ABI=$(adb shell getprop ro.product.cpu.abi | tr -d '\r')
请注意,由于Android shell总是用CRLF来结束行,所以你必须像上面一样去掉CR,否则其他命令不会正常工作.
请注意,如果你有多个设备连接,设置 ANDROID_SERIAL 这会让事情变得容易一些,因为你不需要具体说明 -s <serial> 每次选择.
现在,将相应的二进制推入设备:
adb push libs/$ABI/minicap /data/local/tmp/
请注意,对于 SDK < 16, 您必须使用 minicap-nopie 未执行的可执行文件 派伊(PIE) 支助。 检查 运行。 sh 用于脚本示例.
二进制不够 我们还需要选择正确的共享库并推进到设备上. 这一点可以如下:.
SDK=$(adb shell getprop ro.build.version.sdk | tr -d '\r')
adb push jni/minicap-shared/aosp/libs/android-$SDK/$ABI/minicap.so /data/local/tmp/
SDK 30以上没有共享的库. 在那些设备上,推出"迷你盖",然后开始 app_process 相反,因为 运行。 sh 已经.
此时,检查一下用法可能是有益的:
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -h
注意,你需要设置 LD_LIBRARY_PATH 每次你打电话给迷你帽,否则它找不到共享的图书馆.
另外,每次使用迷你盖时,还需要指定显示和投影的大小. 这是因为我们不得不使用私人API来访问许多三星设备上的信息断层(因为迷你帽本身运行正常)。 这个 运行。 sh 帮助脚本提供 autosize 上文提到的帮助者.
因此,让我们假设你的设备有一个1080x1920屏幕. 首先,让我们进行快速检查,看看您的设备是否能够运行当前版本的迷你盖:
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
-P 参数的格式是 : {RealWidth}x{RealHeight} 虚拟Width}x{虚拟Height}/{Orientation}。 "虚拟"大小是所期望的投影的大小. 取向论证讲述了设备当前取向是什么(以度为单位),这需要这样,我们才能向帧消费者报告套接字界面的正确取向. 获得当前取向(或旋转)的方法之一是 旋转监视器. apk。 。 。 .
如果命令输出"OK",那么一切都应该很好. 如果它分解出错( 可能挂了一段时间后), 您的设备不支持 我们想知道。 。 。 .
最后,让我们开始迷你帽。 它会开始在抽象的unix域套接字上听取.
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0
现在我们只需要创建一个本地的前进, 这样我们就可以连接到插座.
adb forward tcp:1313 localabstract:minicap
现在可以使用本地端口连接到套接字. 注意目前 一次只支持一个连接 . 不管怎么说,拥有一个以上的连接是没有道理的,因为USB总线会很快饱和. 所以,让我们连接.
nc localhost 1313
这将给您二进制输出, 将在下一节中解释 .
使用量
假设你现在和迷你盖套接字开通了 如果没有,就跟随 指令 见上文.
迷你帽协议是一种简单的基于推取的二进制协议. 当您第一次连接到套接字时,您会得到一个全局头,然后是第一个框架。 全球信头不会再出现。 继续发送更多帧 直到你停止迷你帽.
全局信头二进制格式
曾相见.
| 字节 | 长度 | 类型 | 解释 |
|---|---|---|---|
| 0 个 | 1个 | 未签名字符 | 版本(目前为1) |
| 1个 | 1个 | 未签名字符 | 页眉大小( 从字节 0) |
| 2至5岁 | 页:1 | 金特32 (低端词) | 过程的管道 |
| 第6-9条 | 页:1 | 金特32 (低端词) | 实际显示宽度, 像素 |
| 第10-13条 | 页:1 | 金特32 (低端词) | 以像素计的真实显示高度 |
| 14-17 (中文(简体) ) | 页:1 | 金特32 (低端词) | 虚拟显示宽度, 像素 |
| 第18-21页 | 页:1 | 金特32 (低端词) | 虚拟显示高度, 像素 |
| 22个 | 1个 | 未签名字符 | 显示方向 |
| 第23条 | 1个 | 未签名字符 | 克克比特旗(见下文) |
克克比特旗
目前,可以报告以下怪事:
| 数值 | 名称 | 解释 |
|---|---|---|
| 1个 | QUIRK DUMB | 即使前一个框架没有变化,框架也会被发送. 告密者,不需要你采取任何行动 您可以通过在自己的代码中读取较慢的框架数据来限制捕获率. |
| 2个 | QUIRK ALLYS 实相 | 不论器件取向如何,车架始终是正向的. 在制作图像时需要考虑到这一点. |
| 页:1 | 卡塔尔语NAME | 框架撕裂可能可见。 信息化,不需要任何行动。 我们目前的两种方法都没有表现出这种行为. |
框架二进制格式
看起来像一个潜在的无限次数.
| 字节 | 长度 | 类型 | 解释 |
|---|---|---|---|
| 0-3 (韩语) | 页:1 | 金特32 (低端词) | 框架大小, 以字节表示 (=n) |
| 4(n+4) | 无 | 未签名字符 [] | JPG 格式的框架 |
调试
NDK号已经不再出动了 gdb所以旧的 gdb.sh 帮助已删除 。 以 ndk-build NDK_DEBUG=1 并附加到运行中的 迷你盖进程, 与 NDK 的 lldb 换句话说.
捐款
作为一个小的免责词,"迷你盖"是作者第一次使用C++,因此,除了错误修正和新特性外,甚至任何非功能性修改,使代码更加平庸(最好是不引入新的依赖性)也非常受欢迎.
见 捐款额。 。 。 .
许可证
见 自由主义。 。 。 .
版权:© OpenSTF 项目. 所有权利保留.