安 卓 投 屏
admin
2024-05-11 08:55:10
0

欢迎访问我的博客首页。


安卓投屏

  • 1. 使用截图命令投屏
  • 2. 使用录屏命令投屏
  • 3. 参考

1. 使用截图命令投屏


  配置好 ADB,可以使用下面的命令在安卓端保存截屏图像文件,并将图像文件拷贝到 PC 端。

adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png C:/

  命令 adb shell screencap 不仅可以生成图像文件,还可以生成图像数据流,然后直接在 PC 端获取图像数据,效率更高。下面我们就获取屏幕图像数据,把图像缩小后,模拟点击操作,可以简单地在 PC 端操作手机。

import os
import cv2
import numpy as np
import subprocess as spdef onMouseCallback(event, x, y, flags, param):if event != cv2.EVENT_LBUTTONDOWN:returnscale = paramos.system('adb shell input tap ' + str(x * scale) + ' ' + str(y * scale))def screenshot(scale=4):cv2.namedWindow('screenshot', cv2.WINDOW_AUTOSIZE)cv2.setMouseCallback('screenshot', onMouseCallback, scale)while True:res = sp.Popen('adb shell screencap -p', shell=True, stdout=sp.PIPE)out, _ = res.communicate()# data = out.replace(b'\r\r\n', b'\n')  # Android7 以下。data = out.replace(b'\r\n', b'\n')  # Android7 以上。img = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)img = cv2.resize(img, (img.shape[1] // scale, img.shape[0] // scale), interpolation=cv2.INTER_AREA)cv2.imshow('screenshot', img)if cv2.waitKey(2) & 0xFF == 27:breakcv2.destroyAllWindows()if __name__ == '__main__':screenshot()

2. 使用录屏命令投屏


  下面的命令可以实现录屏。原生安卓系统对 ADB 的支持很好,商用系统则不然。很多商用安卓系统不能使用 screenrecord 命令,报错如第二行。

adb shell screenrecord /sdcard/screen.mp4
/system/bin/sh: screenrecord: inaccessible or not found

  和截图命令一样,录屏命令不仅可以输出视频文件,还可以输出视频数据流。对于支持录屏命令的安卓系统,可以使用下面的代码获取屏幕图像数据流。相比截屏命令,这种方式投屏的帧率有明显提升。

import cv2
import time
import numpy as np
import subprocess as spdef screenrecord(scale=4):# 1. 获取屏幕分辨率。# noinspection PyBroadExceptiontry:tmp = sp.Popen('adb shell wm size', shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)resolution, _ = tmp.communicate()wh = resolution.strip().decode().split(': ')[1].split('x')except Exception as _:print('ABD failed to connect devices, please run "adb devices" to find more error messages!')return# 2. 获取屏幕流。screen_cmd = ['adb', 'exec-out', 'screenrecord', '--output-format=h264', '--size=' + wh[0] + 'x' + wh[1], '-']screen_stream = sp.Popen(screen_cmd, stdout=sp.PIPE, universal_newlines=True)ffmpeg_cmd = ['ffmpeg', '-i', '-', '-f', 'rawvideo', '-vcodec', 'bmp', '-vf', 'fps=5', '-']ffmpeg_stream = sp.Popen(ffmpeg_cmd, stdin=screen_stream.stdout, stdout=sp.PIPE)while True:size_bytes = ffmpeg_stream.stdout.read(6)if len(size_bytes) == 0:print('Failed to find img!')time.sleep(1)continuesize = 0for i in range(4):size += size_bytes[i + 2] * 256 ** ibmp_data = size_bytes + ffmpeg_stream.stdout.read(size - 6)img = cv2.imdecode(np.frombuffer(bmp_data, dtype=np.uint8), 1)img = cv2.resize(img, (img.shape[1] // scale, img.shape[0] // scale), interpolation=cv2.INTER_AREA)cv2.imshow('screenrecord', img)cv2.waitKey(1)if __name__ == '__main__':screenrecord()

  该代码使用了 adb exec-out,要求 ADB 版本最低为 1.0.41。上面的代码先使用截图命令 screenrecord 获取 h264 格式的屏幕图像数据流,再使用 ffmpeg 解码 h264 数据流,最后使用 OpenCV 显示解码数据。

3. 参考


  1. Webrtc 流式传输 Android 屏幕,python 黑洞网,2020。
  2. Android SDK Platform-Tools,developer.android.google.cn。
  3. ffmpeg,ffmpeg 官网。

相关内容

热门资讯

【看表情包学Linux】进程地...   🤣 爆笑教程 👉 《看表情包学Linux》👈 猛...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
编译原理陈火旺版第三章课后题答... 下面答案仅供参考! 1.编写一个对于 Pascal 源程序的预处理程序。该程序的作用是...
MacBookPro M2芯片... MacBookPro M2芯片下如何搭建React-Native环境目录软件下载环境配置 目录 写在...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
pyflink学习笔记(六):... 在pyflink学习笔记(一)中简单介绍了table-sql的窗口函数,下面简单介绍下...
创建deployment 创建deployment服务编排-DeploymentDeployment工作负载均衡器介绍Depl...
gma 1.1.4 (2023... 新增   1、地图工具    a. 增加【GetWorldDEMDataSet】。提供了一套 GEO...
AI专业教您保姆级在暗影精灵8... 目录 一、Stable Diffusion介绍    二、Stable Diffusion环境搭建 ...
vue笔记 第一个Vue应用 Document{{content}}{{...
Unity自带类 --- Ti... 1.在Unity中,自己写的类(脚本)的名字不能与Unit...
托福口语21天——day5 发... 目录 一、连读纠音 二、语料输入+造句输出 三、真题 一、连读纠音 英语中的连读方式有好几种...
五、排序与分页 一、排序 1、语法 ORDER BY 字段 ASC | DESC ASC(ascen...
Linux系统中如何安装软件 文章目录一、rpm包安装方式步骤:二、deb包安装方式步骤:三、tar....
开荒手册4——Related ... 0 写在前面 最早读文献的时候,每每看到related work部分都会选择性的忽略&...
实验01:吃鸡蛋问题 1.实验目的: 通过实验理解算法的概念、算法的表示、算法的时间复杂度和空间复杂度分析&...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
Spring Cloud Al... 前言 本文小新为大家带来 Sentinel控制台规则配置 相关知识,具体内容包括流控...
多项目同时进行,如何做好进度管... 多项目同时进行,如何做好进度管理? 大多数时候,面对项目进...
ATTCK红队评估实战靶场(二... 前言 第二个靶机来喽,地址:vulunstack 环境配置 大喊一声我...