Python实现Android设备录屏功能及停止录屏功能

1、功能概述?

提供源码下载

之前通过ADB命令实现了实时的录屏功能。但是很遗憾,虽然通过adb命令录屏非常方便,但由于权限限制,无法在安卓系统较高的设备上使用。现选择使用另一开源工具来解决这一问题,并记录使用详细过程。

本文主要实现录屏及停止录屏功能,实测有效。

2、安装ADB服务?

录屏服务需要依赖adb,所有需要先安装adb服务

Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。通过adb这个服务,我们可以识别加载Android系统,并执行相对应的操作如:查询运行的设备、运行设别的名称版本等。

2.1、下载SDK Platform-Tools

点击下面的地址,同意服务,就能自动下载

官方下载地址:
https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn#downloads

2.2、将安装包解压到你的电脑中

我们主要使用的就是这个abd.exe的服务

2.3、配置adb的环境变量

右击”此电脑”->选择”属性”->点击”高级系统设置”->在弹框中选择”高级”->点击”环境变量”

双击”PATH”->点击”新建”->将adb的路径配置进去(就是解压的那个路径)

2.4、测试adb是否安装成功

这里如果连接真机,就通过usb线连接后,打开手机的开发者模式,打开USB调试,将USB配置选择为MIDI或者MTP多媒体传输等。

测试命令:adb devices

3、下载安装SCRCPY服务

本服务支持Windows\macos\linux

本文章只要使用scrcpy开源工具进行录屏

3.1、服务下载地址

https://github.com/Genymobile/scrcpy

对应的系统版本中都有安装和常用的命令

按照操作系统的位数进行下载合适的版本

 3.2、其他系统安装方式

【macOS系统安装方式】

brew install scrcpy

【Linux系统安装方式】

apt install scrcpy

 3.3、scrcpy快速使用-实时投屏功能

解压后直接点击目录中的scrcpy.exe即可默认加载Android设备

  

实时屏幕共享如下:

  

 4、Python中实现录屏及停止录屏

 4.1、在python中安装依赖服务

执行命令: pip install console-ctrl

作用:用于通过pid停止录屏功能

  

 4.2、在Python中创建脚本实现录屏

核心命令解释:

scrcpy -s 587847ef  --record  D:/files/999.mp4  --no-display  --no-window

-s 587847ef:表示指定录屏设备,通过adb命令能够查看到设备名称

--record  D:/files/999.mp4:表示录制的视频放置在D:/files目录中

--no-display:录屏的时候不打开镜像

--no-window:不显示窗体

--no-display   --no-window:能够实现录屏的时候不弹出任何的窗口提示

import datetime
import os
import subprocess
import timeimport console_ctrl
import psutildef start_scrcpy_recording():global pid,record_procnow_time = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')path = 'D:/files/video_{}.mp4'.format(now_time)# 指定需要录频的设备device_id = "587847ef"# 切换目录,这个目录是scrcpy的解压目录os.chdir("C:/Users/Administrator/Desktop/scrcpy-win64-v2.7")# 执行录频命令command = f"scrcpy -s 587847ef  --record D:/files/999.mp4 --no-display  --no-window"try:def 录屏并回传视频_scrcpy(name,casename,deviceName):name = str(name)file_name = name[name.rfind("\\") + 1:len(name) - 10] + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + ".mp4"filepathoriginal = 获取文件存储路径()filepath = str(filepathoriginal).replace("/", "\\")print("=====filepath11===",filepath)# 切换目录,这个目录是scrcpy的解压目录currentPath=os.getcwd()os.chdir("C:/scrcpy-win64-v2.7/scrcpy-win64-v2.7")print("==========5====filename====",file_name)# 执行录频命令command = f"scrcpy -s {deviceName}  --record {filepath}/{file_name} --no-display   --no-window"try:record_proc = subprocess.Popen(command,shell=True,creationflags=subprocess.CREATE_NEW_CONSOLE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)pid=record_proc.pidprint("====scrcpy 命令执行成功======",record_proc.pid)except  subprocess.CalledProcessError as e:print("================程序异常==================")print(f"scrcpy 命令执行失败,错误代码: {e.returncode}")# 4、将视频信息添加到数据库中targetfilepath = "E:/hazq/executiveprocess/" + datetime.datetime.now().strftime("%Y%m%d") + "/" + file_nameprint("=====修改数据=====",name[name.rfind("\\") + 1:len(name) - 10])修改用例执行视频结果(name[name.rfind("\\") + 1:len(name) - 10], casename, targetfilepath,str(pid),filepathoriginal)#print("=============录屏并回传成功=============")# 路径切换成原始路径os.chdir(currentPath)# 通过遍历判断,在剩余空间较大的盘符创建文件夹存储文件。
def 获取文件存储路径():diskinfos = psutil.disk_partitions()maxfreediskname=""maxfreediskspace=0for diskinfo in diskinfos:disk=psutil.disk_usage(diskinfo.device)free_space = disk.free/(1024*1024*1024)if(float("{:.2f}".format(free_space))>float(maxfreediskspace)):maxfreediskspace = float("{:.2f}".format(free_space))maxfreediskname = diskinfo.devicefilepath=maxfreediskname.replace("\\","/")+"hazqocr/executiveprocess"filepath = filepath + "/" + datetime.datetime.now().strftime("%Y%m%d")if not os.path.exists((filepath)):os.makedirs(filepath)print("目录创建成功:", filepath)else:print("目录已存在:", filepath)return filepath# 停止录屏函数
def closeEvent():if record_proc:if record_proc.poll() is None:console_ctrl.send_ctrl_c(pid)if __name__ == '__main__':start_scrcpy_recording()

执行后录频信息如下

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jsoup爬虫如何快速获取到html页面的选择器元素

java jsoup爬虫如何快速获取到html页面的选择器元素 一、打开元素选择器二、选定元素三、定位元素位置四、右键 -> copy ->copySelector五、代码中获取 一、打开元素选择器 在java采用jsoup爬虫中,返回的是html页面而不是json字段,就需要使用jsou…

[C++11] 右值引⽤与移动语义

文章目录 左值和右值左值(Lvalue)右值(Rvalue)区别 左值引⽤和右值引⽤左值引用(Lvalue Reference)右值引用(Rvalue Reference)右值引用的特点 右值引用延长生命周期右值引⽤和移动语…

传输层UDP

再谈端口号 端口号:标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息,我们有两种命令查看网络通信1.用netsta…

Linux-练习3

题目: 操作过程: 1.建立用户组 shengcan,其id 为 2000 2.建立用户组 caiwu,其id 为 2001 3.建立用户组 jishu,其 id 为 2002 4.建立用户 lee,指定其主组 id 为 shengchan,附加组为 jishu 和…

多GPU训练大语言模型,DDP, ZeRO 和 FSDP

在某些时候,我们可能需要将模型训练扩展到单个 GPU 之外。当模型变得太大无法适应单个 GPU 时,需要使用多 GPU 计算策略。但即使模型适合单个 GPU,使用多个 GPU 来加速训练也是有好处的。即使您正在处理一个小模型,了解如何在多个…

在浏览器中运行 Puppeteer:解锁新能力

Puppeteer,这个强大的浏览器自动化工具,通常在Node.js环境中运行。但你有没有想过,在浏览器本身中运行Puppeteer会是什么样子?这不仅能让我们利用Puppeteer的功能完成更多任务,还能避开Node.js特定的限制。 支持的功…

【Canvas与桌面】文山甲密铺桌面壁纸 1920*1080

【成图】 不加蒙版的部分截图&#xff1a; 加上蒙版的桌面壁纸图&#xff1a; 不加蒙版的桌面壁纸图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&qu…

ts:对象数组的简单使用

ts中对象数组的简单使用 一、主要内容说明二、例子1、源码12、源码1运行效果 三、结语四、定位日期 一、主要内容说明 平常ts创建数组的格式如下&#xff1a; let array:string[]["元素1","元素2","元素3","元素3","元素4"…

Java语言-异常

目录 1.异常的概念与体系结构 1.1 异常的概念 1.2 异常的体系结构 1.3 异常的分类 1.3.1 编译时异常(受查异常) 1.3.2 运行时异常(非受查异常) 2.异常的处理 2.1 防御式编程 2.1.1 LBYL 2.1.2 EAFP 2.2 异常的抛出 2.3 异常的捕获 2.3.1 异常声明throws 2.3.2 …

Spring IoC DI

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1. 应用分层 1.1 如何分层: 1.2 MVC与三层架构区别联系 2. Spring 3.IoC & DI⼊⻔ 3.1 什么是IoC&#xff1f; 3.2 DI 介绍 …

ctfshow——web(持续更新)

文章目录 1、web签到题——base64编码特征2、web2——登录框测试&sqlmap使用3、web3——php伪协议 1、web签到题——base64编码特征 查看源代码&#xff1a; base64编码特征&#xff1a;大小写数字&#xff0c;偶尔最后几位是。 2、web2——登录框测试&sqlmap使用 …

合约门合同全生命周期管理系统:企业智能合同管理的新时代

合约门合同全生命周期管理系统&#xff1a;企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展&#xff0c;合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议&#xff0c;合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…

解读AVL树:平衡二叉搜索树的奥秘

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 前言&#xff1a; 前面我们已经介绍了二叉搜…

交易逆序对的总数 ---- 分治-归并

题目链接 题目: 分析: 解法一: 暴力解法, 遍历所有的数对, 找到逆序对, 需要两重for循环, 一定会超时解法二: 归并排序的思想如果我们将数组分成两半, 我们在每一半中各找一个数字, 判断是否为逆序对, 再根据归并的思想, 再将一半数组分半, 判断是否为逆序对, 直到数组只有一…

【论文笔记】xGen-MM (BLIP-3): A Family of Open Large Multimodal Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: xGen-MM (BLIP-3): A Fami…

网络编程_day3

#1024程序员节 #三次握手四次挥手#四次挥手#udp#recvfrom#sendto#服务器模型#客户端模型#Linux IO模型#阻塞式IO#非阻塞IO#设置非阻塞的方式 目录 【0】复习 【1】三次握手四次挥手 四次挥手 四次挥手既可以由客户端发起&#xff0c;也可以由服务器发起 【2】udp 1. 通信流程 2…

实验:使用Oxygen发布大型手册到Word格式

此前&#xff0c;我曾发表过一篇文章《结构化文档发布的故事和性能调优》&#xff0c;文中讨论了在将大型DITA手册转换为PDF格式时可能遇到的性能挑战及相应的优化策略。 近日&#xff0c;有朋友咨询&#xff0c;若将同样的大型手册输出为MS Word格式&#xff0c;是否也会面临…

Linux复习-C++

参考博客&#xff1a; https://blog.csdn.net/qq_45254369/article/details/126023482?ops_request_misc%257B%2522request%255Fid%2522%253A%252277629891-A0F3-4EFC-B1AC-410093596085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&req…

[JAVAEE] 多线程的案例(一)-单例模式

目录 一. 单例模式 二. 单例模式的使用时机 三. 单例模式的关键代码 四. 单例模式的几种实现方式 4.1 饿汉方式(急) 4.2 懒汉模式(缓) a. 解决原子性的问题 b. 解决程序运行效率低下的问题 c. 解决指令重排序的问题(其次是为了解决内存可见性的问题) 五. 总结 一. …

HCIP-HarmonyOS Application Developer 习题(十七)

&#xff08;判断&#xff09;1、对于用户创建的一些临时卡片在遇到卡片服务框架死亡重启&#xff0c;此时临时卡片数据在卡片管理服务中已经删除&#xff0c;且对应的卡片ID不会通知到提供方&#xff0c;所以卡片使用方需要自己负责清理长时间未刚除的临时卡片数据。 答案&…