文章目录

  • 引言
  • gpt3.5给出的代码
  • 更换截图函数——ImageGrab.grab
  • 禁用imshow解决递归现象
  • 摄像头录制代码
  • 后期需求

引言

关于屏幕录制这个功能需求,之前用过基于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()

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

更换截图函数——ImageGrab.grab

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

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)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# 停止录制
out.release()
cv2.destroyAllWindows()

禁用imshow解决递归现象

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

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

经尝试,将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'):#     breakcnt = cnt + 1if cnt == 100:  #满100帧后终止循环break# 停止录制
out.release()
cv2.destroyAllWindows()


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

这样,我们就可以基本实现用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 orientationframe = cv2.flip(frame, 90)# Displaying the current frameoutput.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 loopif cv2.waitKey(1) == ord('x'):break# Releasing everything after coming out of loop
cap.release()
output.release()
cv2.destroyAllWindows()

后期需求

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

参考文档:
[1] python视频操作——python实现读取和保存视频
[2] 择一柳 python 怎样实现屏幕视频录制?

如何用Python进行屏幕录制?相关推荐

  1. python实现屏幕录制_Python实现屏幕录制功能的代码

    前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了下能不能通过万能的python来实现呢?经过一晚上的尝试发现 ...

  2. python实现屏幕录制_GitHub - Sijiu/record-camera-and-screen: 录制摄像头和录制屏幕,两者之间可以轻易切换...

    使用Python3基于FFmpeg实现的录制摄像头和屏幕录制 1. 项目介绍 该项目是为珠海一家音频技术公司开发的会议视频录制管理工具.客户需求使用的场景是在会议室开会时切换录制电脑屏幕和摄像头的内容 ...

  3. python实现屏幕录制_屏幕录制工具有哪些?这是可以实现无水印录制的

    屏幕录制工具有哪些?屏幕录制可以运用的场景是非常多的,比方说屏幕录制游戏视频.屏幕录制直播视频.屏幕录制追剧视频.屏幕录制网课视频.屏幕录制演示视频.屏幕录制会议视频.屏幕录制讲座视频等等.那么,屏幕 ...

  4. python实现屏幕录制_使用python调用ffmpeg的录制项目总结

    录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别做作总结: ...

  5. python实现屏幕录制_JavaScript 屏幕录制 API 学习

    This example shows you the contents of the selected part of your display. Click the Start Capture bu ...

  6. python 屏幕录制_Python实现屏幕录制功能的代码

    前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了下能不能通过万能的python来实现呢?经过一晚上的尝试发现 ...

  7. python实现屏幕视频录制_Python实现屏幕录制功能的代码

    前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了下能不能通过万能的python来实现呢?经过一晚上的尝试发现 ...

  8. python屏幕录制与回放_Python实现屏幕录制功能的代码

    前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了下能不能通过万能的python来实现呢?经过一晚上的尝试发现 ...

  9. 使用opencv-python制作屏幕录制工具

    使用opencv-python制作屏幕录制工具 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 总结 最近有在使用屏幕录 ...

最新文章

  1. 澳大利亚悉尼科技大学招收人工智能/软件工程方向全奖博士生
  2. 3451: Tyvj1953 Normal 点分治 FFT
  3. 经典技术书籍分享(5):《WCF技术内幕》封面和购买地址
  4. 别了,JavaScript;你好,Blazor
  5. Android逆向笔记-单机游戏通过配置文件修改技能等
  6. 课程作业01的设计思想、程序流程图、源程序代码和结果截图整理
  7. MongoDB学习探讨
  8. python自动化办公-python自动化办公?学这些就够用了
  9. JavaWeb:cookies和storage的区别
  10. 嵌入式Linux培训开发
  11. 2022-2028全球智能门锁系统行业调研及趋势分析报告
  12. caffe调用之前的权重和接着断点继续训练
  13. vue前端项目基于淘宝lib-flexible做手机端适配
  14. IC前端数字验证导学
  15. Vue 移动端调用相机和相册实现图片上传
  16. 六类网线钳能压五类水晶头吗_一分钟自制高质量水晶头,如何区分超5类水晶头与6类水晶头?...
  17. 南阳oj入门题-A+B Problem
  18. getDate方法的妙用(js判断闰年)
  19. JS检测是否有企业微信应用程序
  20. Downie 4 for Mac(最好用的视频下载软件)

热门文章

  1. OS - Bitcode App 瘦身中间码
  2. 编程成为高中生选择性必修课程,孩子太难了!
  3. Nwafu-OJ-1421 Problem S C语言实习题四——4.数据顺序调整
  4. 快乐英语新概念英语 绿色
  5. 女生学计算机好吗有辐射,电脑辐射会给女人带来的危害
  6. 自己操作SMT贴片过程 BGA QFN封装
  7. AD10 PCB板的绘制步骤
  8. AD10右下角显示标题
  9. 使用reCAPTCHA实现验证码
  10. 中科大刘淇:从自适应学习的角度理解AI+教育