用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格式放给你们看看。
不过模糊了好多,还多了一些莫名的××点点😒
在这里插入图片描述

最后
在这里插入图片描述
😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值