网站首页 > 技术文章 正文
文/IT可达鸭
图/IT可达鸭、网络
写在前面
这次不蹭热点了,简简单单分享一个录屏软件的源码。我在阅读了近十多个录屏软件的源码后,发现这个是最简单,最好练手的一个源码。
为了便于理解,里面的一些不必要的代码我作了删减,主要是用来学习研究。
- 环境配置
python版本: 3.6.0
编辑器: pycharm
项目所需要的环境安装包
pip install numpy
pip install opencv-python
pip install pillow
- 需要注意的点
要先安装numpy,再安装opencv-python。
第一步:导包
time: 是一个时间包,其中time.sleep(n) 表示主线程睡眠 n 秒钟,子线程可以并发执行。
threading: 是一个关于线程操作的包,包括常用的线程函数、线程对象、锁、事件等。
cv2: 是一个强大的图像处理库 opencv, 据说人脸识别、视频处理等操作都可以做到。
numpy: 是一个扩展包,支持大量的维度数组与矩阵运算,包含大量数学函数。
PIL: 是一个图像处理标准库,一般和opencv一起用。
- 进程和线程简单介绍
什么是进程?举个例子,音乐播放器是一个进程,浏览器也是一个进程,互相不干扰。
什么是线程?音乐播放器中,音频播放是一个线程、歌词播放也是一个线程,它们之间有交流,保证歌词和音频同步播放。
第二步:录屏线程编写
写一个屏幕录制线程工具类,继承 threading.Tread。重写__init__() 方法,调用threading.Thread的__init__() 方法。重写 run() 方法,不断截屏,并保存到video 对象中。利用 b_record 来控制是否停止录屏。这是一个线程开发的基本写法,只要涉及多线程,都可以这么写。
后续如果想加一个录制麦克风声音,可以写一个声音录制的线程类。
第三步:主函数
首先设定好录屏保存的路径,新建一个录屏对象。 start() 启动录制线程,time.sleep(10) 表示主线程停留10秒,但是录屏线程依旧运行。直到主线程运行十秒后,运行 stop_record(), 修改b_record 变量为Flase,录屏线程检测变化到就会立刻停止录屏,并输出保存视频文件。
完整代码
# encoding:utf-8
import time
import threading
from cv2 import cv2
import numpy as np
from PIL import ImageGrab
class VideoCapThread(threading.Thread):
def __init__(self, video_file='record.avi'):
threading.Thread.__init__(self)
self.b_record = True
self.video = cv2.VideoWriter(video_file,
cv2.VideoWriter_fourcc(*'XVID'),
32, ImageGrab.grab().size) # 帧率为32,可以调节
def run(self):
while self.b_record:
im = ImageGrab.grab()
imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)
self.video.write(imm)
self.video.release()
cv2.destroyAllWindows()
def stop_record(self):
self.b_record = False
if __name__ == "__main__":
avi_file = 'data/avi_tmp.avi'
t1 = VideoCapThread(avi_file)
t1.start()
time.sleep(10) # 录制10s
t1.stop_re
最后,附上完整代码。仅有三十多行,是不是非常简洁?其实,编程也没那么难。
结语
当然,距离完整的录屏软件还有很多东西可以做。如果有兴趣深究下去,可以在这个源码的基础上做优化和改进。例如,录制屏幕的分辨率设置、录屏位置坐标自由设置、增加UI界面(QtPython)、增加声音或者麦克风录制、视频音频合并(FFmpeg)等等。
如果有疑问想获取源码,可以关注后,在后台私信我,回复:python录屏。 我把源码发你。持续关注"IT可达鸭" ,每天分享有趣Python源码。最后,感谢大家的阅读,祝大家工作生活愉快!
- 上一篇: 2D电气图(非矢量图)一键转为CAD图纸
- 下一篇: 利用python在excel中画图的实现方法
猜你喜欢
- 2024-09-11 给3D Slicer添加Python第三方插件库
- 2024-09-11 使用Python创建自己的Instagram滤镜
- 2024-09-11 薅羊毛我愿称Python为最强,Python 自动化带你轻松赚钱
- 2024-09-11 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门
- 2024-09-11 使用python实现简易的人脸检测(python人脸检测106关键点)
- 2024-09-11 机器视觉技术(一)边缘提取(机器视觉边缘检测)
- 2024-09-11 Python-OpenCV 16. 图像特征检测与描述算法
- 2024-09-11 Flask—远程查看行空板USB摄像头视频
- 2024-09-11 OpenCV+Python识别车牌和字符分割的实现
- 2024-09-11 在Fedora中安装OpenCV-Python | 二
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)