pyhton实现录屏

python代码录屏录音


写的不是很好,不如那些obs的录屏软件,而且没有实现音频和视频的合并,请多见谅。

def audio_record() 实现音频录制
def video_record() 实现视频录制
def on_press(key) 按键监听
import time,threading
from datetime import datetime

import pynput
from PIL import ImageGrab
from cv2 import *
import numpy as np
import pyaudio
import wave
from pynput.keyboard import Key,Listener

def audio_record():
    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
    CHUNK=1024
    FORMAT=pyaudio.paInt16#编码格式
    CHANNELS=1 #单声道
    RATE=16000#采样率
    audio=pyaudio.PyAudio()
    idx=2#内录设备号
    #逐一查找声音设备
    # for i in range(audio.get_device_count()):
    #     InFo=audio.get_device_info_by_index(i)
    #     print(InFo)
    #     if InFo['name'].find('立体声混音')>=0 and InFo['hostApi']==0:
    #         idx = i
    if idx:
        stream=audio.open(format=FORMAT,#音频流wav格式
                          channels=CHANNELS,#单声道
                          rate=RATE,#采样率
                          input=True,
                          input_device_index=idx,#指定内录设备的id,可以不写,使用win的默认录音设备
                          frames_per_buffer=CHUNK,#声道
                          )
        frames=[]#录制的音频流
        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()
                stream.stop_stream()
                stream.close()
                # 打开用于保存数据的文件
                wf = wave.open('%s.wav' % name, 'wb')
                # 设置音频参数
                wf.setnchannels(CHANNELS)
                wf.setsampwidth(audio.get_sample_size(FORMAT))
                wf.setframerate(RATE)
                # 写入数据
                wf.writeframes(b''.join(frames))
                # 关闭文件
                wf.close()
                # 结束pyaudio
                audio.terminate()
                break
            data = stream.read(CHUNK)
            frames.append(data)
    return

def video_record(): # 录入视频
    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, 30, (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) #写入
        # cv2.imshow('max',imm)
        # cv2.waitKey(0)
        # time.sleep(5) # 等待5秒再次循环
    return
def on_press(key): # 监听按键eerr
    try:
        global flag
        if key ==key.home:
            flag = True # 改变
             # 返回False,键盘监听结束!
            return
        elif key == key.end:
            flag = False
            v= threading.Thread(target=video_record,daemon=True)
            a= threading.Thread(target=audio_record,daemon=True)
            v.start()
            a.start()
    except :
            return
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))))


def run():
      # 当前的时间(当文件名)
    with Listener(on_press=on_press) as listener:  # 键盘监听
        listener.join()  # 等带进程
        return
    time.sleep(1)  # 等待视频释放过后
    video_info()


if __name__ == '__main__':

    for i in range(10):
        name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
        run()
        print(i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/327668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【project】estimate Aβ-PET pattern

1.17 1.16 1.14 写一个函数,输入是每个文件的地址,然后能做这一系列的操作 用AFM0095进行bbr的配准 方法一,间接配准,frmi先到str,再到mni(str2fmri后再fmri2str) fmri2str 只需要dof 6,6个自…

ROS第 2 课 ROS 系统安装和环境搭建

文章目录 方法一:一键安装(推荐)方法二:逐步安装(常规安装方式)1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …

leetcode 2418. 按身高排序

题目 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 解题方法&#xff…

Kafka-RecordAccumulator分析

前面介绍过,KafkaProducer可以有同步和异步两种方式发送消息,其实两者的底层实现相同,都是通过异步方式实现的。 主线程调用KafkaProducer.send方法发送消息的时候,先将消息放到RecordAccumulator中暂存,然后主线程就…

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法 对不起大家,昨天文章里的告别说早了,这个系列还不能就这么结束。 我们前面的文章中讲解过RabbitMQ的用法,所谓MQ就是一种发布订阅模式的消息模型。在Spring中其实本身也为我们提供…

如何十分钟快速看懂一篇英文CV论文?

已经2024年了,该出现一个写论文解读的AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴,一定深有体验——费劲。其他agents也没有能搞定的,今天我发现了一个超级厉害的写论文解读的agent &#xff…

快速上手的 AI 工具-文心一言

简介 最近正打得火热的AIGC概念,相信大家肯定也都多少接触到了,那么AIGC概念股到底是什么呢?我个人最近也看了一些平台如:文心一言、通义千问、讯飞星火、豆包等等!各位朋友也千万不要错过啦,真是各有各的特…

国考省考行测:语句排序,选择首句、选择尾句

国考省考行测:语句排序 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到…

MySQL之单表查询

素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NO…

二阶构造设计模式

目录 构造函数回顾 深入思考 实验 构造函数的真相 半成品对象 引入二阶构造设计模式 设计理念 二阶构造设计模式图 二阶构造示例 完整demo 小结 构造函数回顾 类的构造函数用于对象的初始化。构造函数与类同名并且没有返回值。构造函数在对象定义时自动被调用 深入…

《机器人学一(Robotics(1))》_台大林沛群 第4周 Quiz4

前两题主要是细心观察即可,第三题主要是使用勾股定理以及简单的反三角函数求解即可,长度与角度答案分别为80和30,不作赘述,主要阐述从第四题开始的解题过程。 目录 P4.P5 - P7.P8. P4. 根据上述推导过程编写代码如下: import num…

nn.BCEWithLogitsLoss中weight参数和pos_weight参数的作用及用法

nn.BCEWithLogitsLoss中weight参数和pos_weight参数的作用及用法 weight参数pos_weight参数 weight参数 上式是nn.BCEWithLogitsLoss损失函数的计算公式,其中w_n对应weight参数。 如果我们在做多分类任务,有些类比较重要,有些类不太重要&…

Java实现城市桥梁道路管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统,支持…

项目压测优化实践思路

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式|混入(mixin)|插件)

文章目录 前要:前端路由的概念与原理1)什么是路由2)SPA与前端路由3)什么是前端路由4)前端路由的工作方式 一、Vue-router简单使用1)什么是vue-router2) vue-router 安装和配置的步骤① 安装 vue-router 包②…

【MATLAB源码-第112期】基于matlab的IDMA系统仿真,输出误码率和误块率,采用turbo编码。

操作环境: MATLAB 2022a 1、算法描述 IDMA(交织多址接入)系统详细描述 1. 基本原理: - IDMA是一种基于码分多址(CDMA)的通信技术,它通过为每个用户分配一个独特的交织模式来实现用户之间…

vue前端开发自学基础,动态切换组件的显示

vue前端开发自学基础,动态切换组件的显示&#xff01;这个是需要借助于&#xff0c;一个官方提供的标签&#xff0c;名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…

eureka进行服务注册

1.引入依赖 在想要在eureka注册的服务的pom.xml文件中引入eureka客户端依赖 <!--eureka客户端依赖--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> …

canvas创建图像数据,并在画布上展示

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

QT上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 进度条是一个比较常见的控件。如果某个操作需要很长的时间才能完成&#xff0c;那么这个时候最好有一个进度条提示&#xff0c;这样比较容易平复一…
最新文章