脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 用Python进行屏幕录制的实现

用Python进行屏幕录制的实现

2024-04-18 14:26鹅毛在路上了 Python

关于屏幕录制这个功能需求,之前用过基于ffmpeg的Capture录屏软件,但是fps拉高以后会变得很卡,声音也同样出现卡顿,所以本文给大家介绍了用Python进行屏幕录制的实现,感兴趣的朋友可以参考下

引言

关于屏幕录制这个功能需求,之前用过基于ffmpeg的Capture录屏软件,但是fps拉高以后会变得很卡,声音也同样出现卡顿。也自己尝试过在python中调用ffmpeg的库函数,效果也不尽人意。网络上下载了几款录屏软件,不是要收费就是下载到捆绑软件或广告很是心累,因此想借此机会重新研究一下屏幕录制软件的工作原理,同时当作一个小项目练手。

gpt3.5给出的代码

当我还在犹豫是否要精心翻阅一下ffmpeg的说明书时,没想到gpt已果断给出了参考答案,可以使用Python的PyAutoGUI库来实现录屏功能。以下是一个简单的示例代码:

import pyautogui
import cv2
import numpy as np

# 获取屏幕分辨率
screen_size = (1920, 1080)

# 设置视频编码器
fourcc = cv2.VideoWriter_fourcc(*"XVID")

# 创建视频写入对象
out = cv2.VideoWriter("output.avi", fourcc, 20.0, screen_size)

# 开始录屏
while True:
    # 获取屏幕截图
    img = pyautogui.screenshot()

    # 将截图转换为OpenCV格式
    frame = np.array(img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 写入视频
    out.write(frame)

    # 按下q键退出录屏
    if cv2.waitKey(1) == ord("q"):
        break

# 释放资源
out.release()
cv2.destroyAllWindows()

从给出的代码看来,屏幕录制的工作原理就是以一定的帧率不断地截图,然后将截取的图片以相同的帧率合成一个视频

放在安装了pyautogui的python环境里运行后,果然不出意外的话就要出意外了。gpt3.5给出的代码卡在运行中的界面纹丝不动,按’q’回车也并未退出循环,再问gpt也死活给不出修改方案。

查阅资料后发现要先imshow()之后,在ui窗口区域内按键才能有效终止循环:

import numpy as np
import pyautogui
import cv2

# 设置录制参数
SCREEN_SIZE = (1920, 1080)
FILENAME = 'recorded_video.avi'
FPS = 30.0

# 开始录制
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(FILENAME, fourcc, FPS, SCREEN_SIZE)

while True:
    # 获取屏幕截图
    img = pyautogui.screenshot()
    # 转换为OpenCV格式
    frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    # 写入视频文件
    out.write(frame)
    cv2.imshow('Frame', frame)
    cv2.resizeWindow('Frame', 1920, 1080)

    # 检测按键
    if cv2.waitKey(1) == ord('q'):
        break

# 停止录制
out.release()
cv2.destroyAllWindows()

程序是能运行了,但是效果依旧不好,窗口一直有递归的效果,而且导出的视频其实是无法播放的。

用Python进行屏幕录制的实现

更换截图函数——ImageGrab.grab

pyautogui虽然能实现截图,并在imshow里展示出来,但是导出的视频却无法播放,考虑肯能涉及到具体视频编解码参数问题,有懂的朋友请在评论区分享。这里采用更换PIL库中的截图函数ImageGrab.grab,可以实现截图并导出视频了,接下来最大的问题就是解决递归现象。

import numpy as np
import pyautogui
import cv2

# 设置录制参数
SCREEN_SIZE = (1920, 1080)
FILENAME = 'recorded_video.avi'
FPS = 30.0

# 开始录制
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(FILENAME, fourcc, FPS, SCREEN_SIZE)

while True:
    # 获取屏幕截图
    img = pyautogui.screenshot()
    # 转换为OpenCV格式
    frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    # 写入视频文件
    out.write(frame)
    cv2.imshow('Frame', frame)
    cv2.resizeWindow('Frame', 1920, 1080)

    # 检测按键
    if cv2.waitKey(1) == ord('q'):
        break

# 停止录制
out.release()
cv2.destroyAllWindows()

用Python进行屏幕录制的实现

禁用imshow解决递归现象

视频处理时的递归现象其实非常常见,除了物理中的镜面效应(观察两个平行放置的镜子会出现递归的现象),

将摄像头对准显示器,显示器上的画面也会观察到递归的现象:

用Python进行屏幕录制的实现

经尝试,将imshow()禁用后,改为帧计数的方式自定义终止循环就不会出现递归的问题了:

import numpy as np
from PIL import ImageGrab
import cv2

# 设置录制参数
SCREEN_SIZE = (1920, 1080)
FILENAME = 'recorded_video.avi'
FPS = 30.0

# 开始录制
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(FILENAME, fourcc, FPS, SCREEN_SIZE)

cnt = 0
while True:
    # 获取屏幕截图
    # img = pyautogui.screenshot()
    img = ImageGrab.grab(bbox=(0, 0, 1920, 1080))
    print('recordin..')
    # 转换为OpenCV格式
    frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    # 写入视频文件
    out.write(frame)
    # cv2.imshow('Frame', frame)
    # cv2.resizeWindow('Frame', 1920, 1080)

    # # 检测按键
    # if cv2.waitKey(1) == ord('q'):
    #     break

    cnt = cnt + 1

    if cnt == 100:  #满100帧后终止循环
        break

# 停止录制
out.release()
cv2.destroyAllWindows()

用Python进行屏幕录制的实现

通过修改img = ImageGrab.grab(bbox=(0, 0, 2560, 1600))中的参数可以自定义录屏区域,x,y,w,h分别代表左上角坐标(起始坐标)和图片宽度、高度。比如我的屏幕分辨率是2560*1600,那么设置为0, 0, 2560, 1600就是录制全屏:

用Python进行屏幕录制的实现

这样,我们就可以基本实现用Python进行屏幕录制的功能了。动态图预览看上去分辨率不高是因为用的格式工厂把录制的视频转了gif,压缩前录制的视频其实蛮清楚的。

通过修改fps的值,我们还可以自行录制一些高刷新率的电影、游戏画面,fps越高,画面越流畅哦。

摄像头录制代码

类似的,也可以用python实现相机录像的功能:

import cv2
import cv2 as cv

# 打开摄像头
cap = cv2.VideoCapture(0)

fourcc = cv.VideoWriter_fourcc(*'XVID')
file_name = 'output'
output = cv.VideoWriter((file_name + '.avi'), fourcc, 24.0, (640, 480))  #设置文件名,fps,分辨率

while cap.isOpened():

    res, frame = cap.read()
    if not res:
        print("Frame Cannot Be Received")
        break

    # Flipping the frame horizontally to get correct orientation
    frame = cv2.flip(frame, 90)

    # Displaying the current frame
    output.write(frame)
    cv2.imshow('Frame', frame)

    # If no input is received for 1ms, or if the key 'x' is pressed, interpreter goes outside of the loop
    if cv2.waitKey(1) == ord('x'):
        break

# Releasing everything after coming out of loop
cap.release()
output.release()
cv2.destroyAllWindows()

后期需求

现在屏幕录制的问题基本解决了,要想做一个实用的屏幕录制软件,还需要加上音频录制,并设计一个便捷的UI界面。

小结

到此这篇关于用Python进行屏幕录制的实现的文章就介绍到这了,更多相关Python屏幕录制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://waynegao.blog.csdn.net/article/details/130825490

延伸 · 阅读

精彩推荐
  • Pythonpython 实现视频流下载保存MP4的方法

    python 实现视频流下载保存MP4的方法

    今天小编就为大家分享一篇python 实现视频流下载保存MP4的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    huaqiangu112313212021-05-13
  • Python树莓派升级python的具体步骤

    树莓派升级python的具体步骤

    在本篇文章里小编给大家整理的是关于树莓派升级python的具体步骤,需要的朋友们可以参考下。 ...

    爱喝马黛茶的安东尼9452020-07-06
  • Pythonpython的flask框架难学吗

    python的flask框架难学吗

    在本篇内容中小编给大家分享了关于python的flask框架是否难学的相关知识点,有兴趣的朋友们阅读下吧。 ...

    silencement6852020-07-31
  • Pythonpython中super()函数的理解与基本使用

    python中super()函数的理解与基本使用

    super( )函数是用来调用父类的一个方法,super( )函数还用来解决多重继承的问题,下面这篇文章主要给大家介绍了关于python中super()函数的相关资料,文中通过示...

    tigeriaf5832021-12-26
  • PythonTensorflow Summary用法学习笔记

    Tensorflow Summary用法学习笔记

    这篇文章主要介绍了Tensorflow Summary用法学习笔记,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    love小酒窝11292020-04-29
  • Python基于Tensorflow搭建一个神经网络的实现

    基于Tensorflow搭建一个神经网络的实现

    神经网络可能会让人感到恐惧,特别是对于新手机器学习的人来说。这篇文章主要介绍了基于Tensorflow搭建一个神经网络的实现,从入门开始,感兴趣的可以...

    全部梭哈一夜暴富5462021-11-02
  • PythonPython 运行.py文件和交互式运行代码的区别详解

    Python 运行.py文件和交互式运行代码的区别详解

    这篇文章主要介绍了Python 运行.py文件和交互式运行代码的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    Inotime11492021-07-29
  • Pythonpython中单例常用的几种实现方法总结

    python中单例常用的几种实现方法总结

    Python 的模块就是天然的单例模式,下面这篇文章主要给大家介绍了关于python中单例常用的几种实现方法,文中通过示例代码介绍的非常详细,对大家学习或...

    python修行路7792021-04-07