精华内容
下载资源
问答
  • Python录屏程序

    2019-05-11 14:47:04
    本资源为基于Python+OpenCV实现的录屏程序,有需要的朋友可以下载一下。
  • Python移动端录屏库背景日常移动端专项测试和自动化测试通常有一些场景如:Ui自动化的操作捕获、App启动耗时、视频启播耗时等,通常都有需要边操作边录屏,而对于启动耗时测试通常还需要质量较高且帧率稳定的视频源...

    Python移动端录屏库

    背景

    日常移动端专项测试和自动化测试通常有一些场景如:Ui自动化的操作捕获、App启动耗时、视频启播耗时等,通常都有需要边操作边录屏,而对于启动耗时测试通常还需要质量较高且帧率稳定的视频源(如果用stagesepx),本文将介绍双端基于脚本化的录屏解决方案,让录屏更好的和你的case结合

    概述

    它是一个python库,更准确的说是一个录屏的装饰器,名为screcord,意为:screen + record,底层是对scrcpy和xrecord调用的极简封装

    scrcpy和xrecord

    因为screcord底层是对scrcpy和xrecord调用,故在正式介绍之前先梳理一下目前双端现有的录屏方案

    安卓端

    方案

    自动化控制

    兼容性

    视频源质量

    自带录屏功能

    较好

    录屏软件

    较差

    screenrecord

    部分机型没有

    一般

    iOS端

    方案

    自动化控制

    兼容性

    视频源质量

    自带录屏功能

    录屏软件

    较差

    从以上的对比中可以看出:

    scrcpy 实际是一款开源、跨平台的安卓投屏和控制工具,且可以通过命令行控制

    xrecord 是一款开源的iOS端可命令行控制的录屏工具

    原理

    录屏原理

    当你正确安装了scrcpy之后,只需要输入如下命令,即可录取指定设备的屏幕

    scrcpy -s device --render-expired-frames -Nr ./demo.pm4

    --render-expired-frames:尽可能最大帧率

    -N:不再PC端展示

    -r:录制mp4/mkv文件

    iOS端,下载xrecord并通过alias指定xrecord到对应的文件路径

    alias xrecord='./xrecord/bin/xrecord'

    xrecord -q -i device -o ./demo.mp4 -f

    -i, --id:

    Device ID.

    -o, --out:

    Output File.

    -f, --force:

    Overwrite existing files.

    -q, --quicktime:

    Include QuickTime devices (necessary for iOS recording).

    screcord的封装原理

    知道了scrcpy和xrecord的录屏原理之后,就可以通过脚本封装实现了,原理为:

    通过_cmd区分平台拼接录屏命令行

    在record装饰器中通过subprocess.Popen()启动任务

    当case执行完毕后再调用proc.terminate()结束任务

    # record装饰器

    def record(

    platform: typing.Union[str],

    device: typing.Union[str],

    file_path: typing.Union[str, os.PathLike],

    offset: typing.Tuple[int] = (1, 1),

    pre_kill: typing.Union[bool] = True

    ):

    """record wrapper

    platform: 'a', 'android', 'i', 'ios'

    device: android device id or iOS udid

    file_path: mp4 file path

    offset: default (1, 1), mean of: before record sleep 1s and after record sleep 1s

    pre_kill: before start whether kill or not, default True

    """

    def decorator(func):

    @functools.wraps(func)

    def wrapper(*args, **kwargs):

    ofs = _update_offset(offset)

    proc_name, cmd = _cmd(platform, device=device, fp=file_path)

    p = start(proc_name, cmd, pre_kill)

    try:

    time.sleep(ofs[0])

    func(*args, **kwargs)

    time.sleep(ofs[1])

    except Exception as e:

    logger.error(e)

    finally:

    stop(proc_name, p)

    return wrapper

    return decorator

    从_cmd()可以看到,它是通过platform来区分平台,再通过传入的device, file_path拼接成为cmd

    # _cmd,双端录屏命令行拼接方法

    def _cmd(platform: str, **kwargs):

    """build cmd according to platform

    """

    platform = platform.lower()

    assert platform in ('a', 'android', 'i', 'ios'), f"platform should in ('a', 'android', 'i', 'ios')"

    if platform in ('a', 'android'):

    cmd = 'scrcpy -s "{device}" --render-expired-frames -Nr "{fp}"'.format(**kwargs)

    proc_name = 'scrcpy'

    else:

    kwargs['xrecord'] = os.path.join(

    os.path.dirname(screcord.__file__), 'xrecord'

    )

    cmd = '"{xrecord}" -q -i="{device}" -o="{fp}" -f'.format(**kwargs)

    proc_name = 'xrecord'

    logger.info(

    f'\n===== CMD INFO ====='

    f'\nplatform: {platform}'

    f'\nname: {proc_name}'

    f'\ncmd: {cmd}'

    f'\n===================='

    )

    return proc_name, cmd

    使用

    首先,安装screcord库,要求py3.6+

    pip3 install screcord

    在case的方法上引入record这个装饰器即可

    record 方法入参格式如下:

    platform - 安卓/iOS可缩写为:a/i

    file_path - 录屏视频的文件路径,建议mp4格式

    offset - 偏移量,tuple类型,表示录屏开始后,在case开始前等待几秒,case执行完等待几秒,通常用于case前后的等待缓冲期

    pre_kill - 在开始录屏前是否需要kill掉已有的进程

    from screcord import record

    # 安卓端

    device = "xxxxx"

    video_fp = "./demo.mp4"

    @record('android', device, video_fp, offset=(1, 2))

    def start_app():

    # your case

    ......

    # iOS端

    device = "xxxxx"

    video_fp = "./demo.mp4"

    @record('ios', self.device, video_fp, offset=(1, 1), pre_kill=False)

    def start_app():

    # your case

    ......

    值得注意的是:

    iOS端已经将xrecord纳入screcord库,故无需再单独安装

    因为scrcpy同意时刻只允许一个进程运行,所以安卓端建议将pre_kill置为True

    iOS端建议将pre_kill置为False,因为每次启动xrecord时候都会重连设备,这会导致WDA服务中断

    github

    展开全文
  • python录屏软件.py

    2020-04-29 12:54:19
    基于cv2,pyaudio,moviepy的python本地录屏功能实现,可以任意切换输入输出声道。
  • 更新时间:2020年03月02日 13:59:52 作者:linnahan https://www.jb51.net/article/181757.htmimport time,threadingfrom datetime import datetimefrom PIL import ImageGrabfrom cv2 import *import numpy as np...

    更新时间:2020年03月02日 13:59:52 作者:linnahan https://www.jb51.net/article/181757.htm

    import time,threading

    from datetime import datetime

    from PIL import ImageGrab

    from cv2 import *

    import numpy as np

    from pynput import keyboard

    def video_record(): # 录入视频

    global name

    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 当前的时间(当文件名)

    screen = ImageGrab.grab() # 获取当前屏幕

    width, high = screen.size # 获取当前屏幕的大小

    fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D') # MPEG-4编码,文件后缀可为.avi .asf .mov等

    video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high)) # (文件名,编码器,帧率,视频宽高)

    print('3秒后开始录制----') # 可选

    time.sleep(3)

    print('开始录制!')

    global start_time

    start_time = time.time()

    while True:

    if flag:

    print("录制结束!")

    global final_time

    final_time = time.time()

    video.release() #释放

    break

    im = ImageGrab.grab() # 图片为RGB模式

    imm = cvtColor(np.array(im), COLOR_RGB2BGR) # 转为opencv的BGR模式

    video.write(imm) #写入

    # time.sleep(5) # 等待5秒再次循环

    def on_press(key): # 监听按键

    global flag

    if key == keyboard.Key.home:

    flag = True # 改变

    return False # 返回False,键盘监听结束!

    def video_info(): # 视频信息

    video = VideoCapture('%s.avi' % name) # 记得文件名加格式不要错!

    fps = video.get(CAP_PROP_FPS)

    Count = video.get(CAP_PROP_FRAME_COUNT)

    size = (int(video.get(CAP_PROP_FRAME_WIDTH)), int(video.get(CAP_PROP_FRAME_HEIGHT)))

    print('帧率=%.1f'%fps)

    print('帧数=%.1f'%Count)

    print('分辨率',size)

    print('视频时间=%.3f秒'%(int(Count)/fps))

    print('录制时间=%.3f秒'%(final_time-start_time))

    print('推荐帧率=%.2f'%(fps*((int(Count)/fps)/(final_time-start_time))))

    if name == 'main':

    flag = False

    th = threading.Thread(target=video_record)

    th.start()

    with keyboard.Listener(on_press=on_press) as listener:

    listener.join()

    time.sleep(1) # 等待视频释放过后

    video_info()

    展开全文
  • 只是要求附上制作过程视频,就想到了能不能用python做个录屏的程序,于是在网上看了好多文章,发现很多都不是很好用,要不就是太麻烦(我就录个屏,不用声音,也不用控件)。最后看到了一个符合我要求的,可以去看看...

    前言

    由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题。对我们太好了,谢谢老师

    没办法,干就完了。

    只是要求附上制作过程视频,就想到了能不能用python做个录屏的程序,于是在网上看了好多文章,发现很多都不是很好用,要不就是太麻烦(我就录个屏,不用声音,也不用控件)。最后看到了一个符合我要求的,可以去看看这里(感谢!)

    不过呢,俗话说:适合自己的才是最好的。当我们用的时候,会发现录制的时间和视频播放的时间不一致,有的快了,有的慢了,所以就想出了原因与解决办法。接下来先上代码吧

    需要安装的第三方库有pillow、opencv-python、numpy、pynput

    上‘马'

    import time,threading

    from datetime import datetime

    from PIL import ImageGrab

    from cv2 import *

    import numpy as np

    from pynput import keyboard

    def video_record(): # 录入视频

    global name

    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S') # 当前的时间(当文件名)

    screen = ImageGrab.grab() # 获取当前屏幕

    width, high = screen.size # 获取当前屏幕的大小

    fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D') # MPEG-4编码,文件后缀可为.avi .asf .mov等

    video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high)) # (文件名,编码器,帧率,视频宽高)

    #print('3秒后开始录制----') # 可选

    #time.sleep(3)

    print('开始录制!')

    global start_time

    start_time = time.time()

    while True:

    if flag:

    print("录制结束!")

    global final_time

    final_time = time.time()

    video.release() #释放

    break

    im = ImageGrab.grab() # 图片为RGB模式

    imm = cvtColor(np.array(im), COLOR_RGB2BGR) # 转为opencv的BGR模式

    video.write(imm) #写入

    # time.sleep(5) # 等待5秒再次循环

    def on_press(key): # 监听按键

    global flag

    if key == keyboard.Key.home:

    flag = True # 改变

    return False # 返回False,键盘监听结束!

    def video_info(): # 视频信息

    video = VideoCapture('%s.avi' % name) # 记得文件名加格式不要错!

    fps = video.get(CAP_PROP_FPS)

    Count = video.get(CAP_PROP_FRAME_COUNT)

    size = (int(video.get(CAP_PROP_FRAME_WIDTH)), int(video.get(CAP_PROP_FRAME_HEIGHT)))

    print('帧率=%.1f'%fps)

    print('帧数=%.1f'%Count)

    print('分辨率',size)

    print('视频时间=%.3f秒'%(int(Count)/fps))

    print('录制时间=%.3f秒'%(final_time-start_time))

    print('推荐帧率=%.2f'%(fps*((int(Count)/fps)/(final_time-start_time))))

    if __name__ == '__main__':

    flag = False

    th = threading.Thread(target=video_record)

    th.start()

    with keyboard.Listener(on_press=on_press) as listener:

    listener.join()

    time.sleep(1) # 等待视频释放过后

    video_info()

    解决

    观察代码可以发现实现录屏的方式就是不断循环获取屏幕然后写入,可以想到每循环一次就是一帧,而循环一次要多长时间就取决于运行的速度了。所以我们只要让一秒中写入的帧数(也就是1秒中循环的次数)和video中的参数帧率相等,就能获得差不多正常的速度

    因此我在代码中加入了视频信息,算出了视频播放的时间和录制时间,再推算出来正常速度的帧率👉推荐帧率。只要先运行试一下,看一下推荐帧率是多少,再把代码中的参数改过来就行了(要取整数哦)

    要按home键来正常结束程序,才会有video_info出现

    然后呢!我发现老师要我们附制造过程视频,我TM也不可能发个几个几百M甚至上G的视频过去吧,老师也没时间去看吧

    于是乎,我在循环中加入了‘等待5秒',这样就差不多每5秒获取1帧,推荐帧率显示0.20,当然,我不能也不会按这个速度播放,给它来个25倍(帧率为0.20*25=5,这样视频出来就又小又短了🤣)

    多提一下,因为两个线程并不会同时结束,只是通过flag这个变量改变来使得另一个结束,所以按home键flag改变的时候,另一个线程video_record还处于运行循环中,因此我们要等它经过这次循环,进入下一次条件判断,视频才得以从内存释放…呃嗯,就是我要在代码倒数第2行那里等待个5+1=6秒(这样比较保险),否则的话,那个帧数会显示为0,甚至会出现运行错误(不能除0)

    说了那么多,怎么能不给你们看一下效果呢

    成果

    4题,录了4个,最小的不到4M,最大也就14M多点👏

    因为这里放不了AVI,所以我把最小的那个转成GIF格式放给你们看看。

    不过模糊了好多,还多了一些莫名的××点点😒

    最后

    总结

    到此这篇关于python实现录屏功能(亲测好用)的文章就介绍到这了,更多相关python 实现录屏内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!

    展开全文
  • python实现录制全屏和选择区域录屏功能,参数,程序,左键,全屏,屏幕python实现录制全屏和选择区域录屏功能易采站长站,站长之家为您整理了python实现录制全屏和选择区域录屏功能的相关内容。最近给客户演示程序运行...

    python实现录制全屏和选择区域录屏功能,参数,程序,左键,全屏,屏幕

    python实现录制全屏和选择区域录屏功能

    易采站长站,站长之家为您整理了python实现录制全屏和选择区域录屏功能的相关内容。

    最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的。但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的。我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制。在编写这个程序时,我有一个疑问,在初始化写视频VideoWriter函数的第4个参数,它表示视频帧的高和宽,全屏录制方式的参数是(height,width),选择区域录制的参数是(width,height)。我曾尝试过把这个参数统一写成(height,width)或者(width,height)。但是运行程序后,总有一种录屏方式保存的视频文件是无法打开的,文件大小是1kb,不知这是为何?

    import cv2

    from PIL import ImageGrab

    import numpy as np

    import argparse

    import time

    global img

    global point1, point2

    def on_mouse(event, x, y, flags, param):

    global img, point1, point2

    img2 = img.copy()

    if event == cv2.EVENT_LBUTTONDOWN: # 左键点击

    point1 = (x, y)

    cv2.circle(img2, point1, 10, (0, 255, 0), thickness=2)

    cv2.imshow('image', img2)

    elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左键拖曳

    cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)

    cv2.imshow('image', img2)

    elif event == cv2.EVENT_LBUTTONUP: # 左键释放

    point2 = (x, y)

    cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)

    cv2.imshow('image', img2)

    def select_roi(frame):

    global img, point1, point2

    img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)

    winname = 'image'

    cv2.namedWindow(winname, cv2.WINDOW_NORMAL)

    cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

    cv2.setMouseCallback(winname, on_mouse)

    cv2.imshow(winname, img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    return point1, point2

    if __name__ == '__main__':

    parser = argparse.ArgumentParser()

    parser.add_argument('--fps', type=int, default=10, help='frame per second')

    parser.add_argument('--total_time', type=int, default=15, help='video total time')

    parser.add_argument('--savename', type=str, default='video.mp4', help='save file name')

    parser.add_argument('--screen_type', default=1, type=int, choices=[0, 1], help='1: full screen, 0: region screen')

    args = parser.parse_args()

    print('等到3秒,请切换到录屏的页面')

    if args.screen_type==0:

    print('Press Esc to close window')

    time.sleep(3)

    curScreen = ImageGrab.grab() # 获取屏幕对象

    if args.screen_type:

    height, width = curScreen.size

    min_x, min_y, max_x, max_y = 0, 0, width, height

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (height, width))

    else:

    point1, point2 = select_roi(curScreen)

    min_x = min(point1[0], point2[0])

    min_y = min(point1[1], point2[1])

    max_x = max(point1[0], point2[0])

    max_y = max(point1[1], point2[1])

    height, width = max_y - min_y, max_x - min_x

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (width, height))

    imageNum = 0

    while True:

    imageNum += 1

    captureImage = ImageGrab.grab() # 抓取屏幕

    frame = cv2.cvtColor(np.array(captureImage), cv2.COLOR_RGB2BGR)

    if args.screen_type==0:

    frame = frame[min_y:max_y, min_x:max_x, :]

    if imageNum < args.fps * args.total_time:

    video.write(frame)

    # 退出条件

    if cv2.waitKey(50) == ord('q') or imageNum > args.fps * args.total_time:

    break

    video.release()

    cv2.destroyAllWindows()

    到此这篇关于python实现录制全屏和选择区域录屏功能的文章就介绍到这了,更多相关python录屏内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!以上就是关于对python实现录制全屏和选择区域录屏功能的详细介绍。欢迎大家对python实现录制全屏和选择区域录屏功能内容提出宝贵意见

    展开全文
  • 本篇文章,主要介绍如何通过Python发送Ctrl + C的信号,中断正在执行的任务。案例故事: Android系统测试或App测试过程中,可以考虑用adb shell screenrecord /sdcard/video.mp4 命令录制屏幕视频,比如录制某个Bug...
  • 本篇文章小编给大家分享一下python实现录制全屏和选择区域录屏功能代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。代码如下:import cv2from PIL import ...
  • Python录屏(无声)

    千次阅读 2018-09-17 18:48:22
    Python3.7 用到的模块:pillow,opencv-python PIL就是pillow from PIL import ImageGrab import cv2 p = ImageGrab.grab() # 获得当前屏幕信息 ...fourcc = cv2.VideoWriter_fourcc(*'XVID') # 录屏文...
  • python 屏幕录制改进版,无opencv黑框显示! """ from PIL import ImageGrab import numpy as np import cv2 import datetime from pynput import keyboard import threading flag = False # 停止标志位 def ...
  • Python移动端录屏库背景日常移动端专项测试和自动化测试通常有一些场景如:Ui自动化的操作捕获、App启动耗时、视频启播耗时等,通常都有需要边操作边录屏,而对于启动耗时测试通常还需要质量较高且帧率稳定的视频源...
  • 该资源为代码,运行时会自动记录屏幕(录屏),并在当前目录下生成一个包含录制视频的.avi后缀的文件。内含注释,对学习python的朋友有一定帮助。需要者请自行下载。
  • python3 录屏

    2021-04-05 16:29:53
    tkinter写的界面,窗口区域就是录屏区域。 具有开始、暂停,设置倒计时与帧率功能,非常简洁操作简单。 使用该软件录制的视频: 等B站审核通过! 下载地址: 链接:...
  • 今天我想学习记录的内容是——如何用python实现录屏。~~~上课铃~~~1写在前面作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位。以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到...
  • 偶尔需要用python实现录屏并导出视频,随便写了一个简单的代码。 大概思路是先每隔一段时间截屏,然后将截屏图片变成视频导出。 1 # -*- coding: cp936 -*- 2 from PIL import ImageGrab 3 import time,os,...
  • import wavefrom pyaudioimport PyAudio,paInt16from PILimport ImageGrabimport numpyas npimport cv2from moviepy.editorimport *from moviepy.audio.fximport allframerate=8000NUM_SAMPLES=2000channels=1sampwi...
  • 主要介绍了使python实现录屏功能(亲测好用),本文通过实例代码给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
  • Python本地录屏和系统声音**直接上代码** moviepy:视频音频拼接 pyaudio:音频录制 opencv:视频录制 直接上代码 import wave import threading from os import remove,mkdir,listdir from os.path import exists...
  • 偶尔需要用python实现录屏并导出视频,随便写了一个简单的代码。大概思路是先每隔一段时间截屏,然后将截屏图片变成视频导出。1 #-*- coding: cp936 -*-2 from PIL importImageGrab3 importtime,os,cv24 importnumpy...
  • 经常刷到录屏软件的问题,看来大家的对这方便的需求还是挺大的,作为踩过无数坑的过来人,今天我就来盘点一下那些亲测之后好用的电脑录屏软件。其中包含了免费型、简单易用型、专业型,还把下载地址都给贴出来了。一...
  • 使用minicap+python实现录屏功能

    千次阅读 2020-02-26 12:15:38
    七:通过python实现录屏: 1,执行下面代码,可以看到在当前目录下会有手机截屏图片生成。 # coding: utf8 import socket import sys import time import struct from collections import ...
  • 前言 由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题。对我们太好了,谢谢老师
  • 文/IT可达鸭图/IT可达鸭、网络写在前面这次不蹭热点了,简简单单分享一个录屏软件的源码。...环境配置python版本: 3.6.0编辑器: pycharm项目所需要的环境安装包pip install numpypip install opencv-python...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 251
精华内容 100
关键字:

python录屏

python 订阅