zoukankan      html  css  js  c++  java
  • 《自拍教程70》Python adb一键录屏

    本篇文章,主要介绍如何通过Python发送Ctrl + C的信号,中断正在执行的任务。

    案例故事: Android系统测试或App测试过程中,
    可以考虑用adb shell screenrecord /sdcard/video.mp4 命令录制屏幕视频,
    比如录制某个Bug发生的整个过程,比用手机拍摄的视频效果好很多,
    当录制完毕后,我们一般是通过Ctrl + C 来停止录制,然后导出该录屏文件,

    其实我们可用Python脚本实现一键录屏。


    准备阶段
    1. adb shell screenrecord /sdcard/video.mp4 可以录制屏幕视频。
    2. 由于以上录制屏幕视频的命令是一个持续输出的命令,
      它如果没被中断,会一直持续录制下去,直到满3分钟,
    3. os.system可以调用以上命令。
    4. 捕获KeyboardInterrupt异常(即发送Ctrl + C中断信号),中断录制任务。

    Python批处理脚本形式

    记住批处理脚本的精髓: 顺序执行Python语句

    import os
    
    command = "adb shell screenrecord /sdcard/video.mp4"
    
    try:
        print("后台录屏中,您可以Ctrl + C随时结束录制!")
        os.system(command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
    except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
        os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来
    
    print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
    os.system("pause")
    

    Python面向过程函数形式

    找到可以封装成一个函数块的小代码块儿, 用函数封装起来.
    函数的命名一般建议用"动词", 所以我们命名为: "record_screen",
    封装好后, 用record_screen()函数调用即可。

    # coding=utf-8
    import os
    
    
    def record_screen():
        command = "adb shell screenrecord /sdcard/video.mp4"
        try:
            print("后台录屏中,您可以Ctrl + C随时结束录制!")
            os.system(command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
        except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
            os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来
        print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
    
    
    record_screen()
    os.system("pause")
    
    

    Python面向对象形式

    以"一切皆可归类"的思想, 先抽象化出一个类来,
    类名一般建议用"名词", 所以我们命名为"ScreenRecorder",
    代表屏幕录制器, 且一般要驼峰式(首字母大写)来规范类的命名.
    养成良好的类的初始化(init)的习惯,
    初始化过程中, 可以pass(什么都不做)
    这个ScreenRecorder 类, 目前只需要一个录屏的函数(动作功能)就足够了,
    函数的命名一般建议用"动词", 所以我们命名为: "record_screen" .
    类是一个抽象的事物, 必须实例化成具体的对象后,
    才能进行调用, 所以我们实例化并命名成了s_obj, 表明是一个对象.
    实例化成具体对象后, 对象就可以调用record_screen这个函数了.

    # coding=utf-8
    import os
    
    
    class ScreenRecorder():
        def __init__(self):
            self.command = "adb shell screenrecord /sdcard/video.mp4"
    
        def record_screen(self):
            try:
                print("后台录屏中,您可以Ctrl + C随时结束录制!")
                os.system(self.command)  # 开始执行adb录屏命令, 如果不做任何操作,默认最多录制3分钟(180秒)
            except KeyboardInterrupt:  # 随时接收Ctrl + C的信号
                os.system("adb pull /sdcard/video.mp4 .")  # # 导出视频文件来
            print("录制结束,录屏文件导出到了: %s" % os.path.join(os.getcwd(), "video.mp4"))
    
    
    if __name__ == '__main__':
        s_obj = ScreenRecorder()
        s_obj.record_screen()
        os.system("pause")
    

    代码运行方式与效果

    确保Android设备通过USB线与电脑连接了,adb设备有效连接,
    以上代码的3种实现形式都可以直接运行,比如保存为screen_record.py并放在桌面,
    建议python screen_record.py运行,当然也可以双击运行。


    小提示:本来更科学的方法应该是用subprocess.Popen()类的send_signal(signal.CTRL_C_EVENT)函数来实现Ctrl + C,
    但是发现并不能实现Ctrl + C信号,所以最终还是捕获KeyboardInterrupt异常这种方式实现,
    subprocess.Popen()类功能还是很强大的,后续案例还会介绍到。


    更多更好的原创文章,请访问官方网站:www.zipython.com
    自拍教程(自动化测试Python教程,武散人编著)
    原文链接:https://www.zipython.com/#/detail?id=04ecbd58cb304d0fa1c2034ccaa3260d
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/zipython/p/13105174.html
Copyright © 2011-2022 走看看