安 卓 投 屏
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入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...