吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1896|回复: 23
收起左侧

[Python] pyhton实现录屏

  [复制链接]
fuxinbin 发表于 2021-11-19 10:51
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) # 转为opencvBGR模式
        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)

写的比较乱,多多包涵,刚写没多久
同时也欢迎大佬们的指教,一只脚入门的菜鸡在此感谢

免费评分

参与人数 4吾爱币 +11 热心值 +3 收起 理由
coops + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
matao5168 + 1 + 1 热心回复!
Cool_Breeze + 2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cracker丶felon 发表于 2021-11-19 12:53
楼主提个问,我自己写录屏的时候audio.get_device_info_by_index(i)返回汉子是乱码,后来我只能用sounddevice库。不知道楼主有没有遇到这个问题。还有楼主帖子没有说音频内录的开启方法,我这里多嘴一句:开启电脑“立体声混音”,鼠标右击电脑右下角喇叭选择打开声音设置——>选择管理声音设备——>选中立体声混音并启用。然后我是用sounddevice.query_devices()查找的设备来实现音频内录
 楼主| fuxinbin 发表于 2021-11-19 16:49
cracker丶felon 发表于 2021-11-19 12:53
楼主提个问,我自己写录屏的时候audio.get_device_info_by_index(i)返回汉子是乱码,后来我只能用sounddevi ...

没遇到,那个录音设备,我也是那样设置的,下次尽量写全面些,感谢建议
18103431492 发表于 2021-11-19 11:27
Mango1024 发表于 2021-11-19 11:31
小白刚刚开始阶段,感觉你做的蛮酷得支持一下
ki11 发表于 2021-11-19 11:32
18103431492 发表于 2021-11-19 11:27
学习python需要下载什么软件?(我是小白)

vs就可以吧
xxscwsrym 发表于 2021-11-19 11:39
下个PyCharm试试
麦子1995 发表于 2021-11-19 11:52
不错啊,楼主,加油
李佑辰 发表于 2021-11-19 12:03
不错不错 支持支持!!
IITSUKI 发表于 2021-11-19 12:07
opencv就真的只搞图象而不搞其它的
Fxmles 发表于 2021-11-19 12:14
不错,支持
三滑稽甲苯 发表于 2021-11-19 12:31
18103431492 发表于 2021-11-19 11:27
学习python需要下载什么软件?(我是小白)

Python+vsc
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2022-9-25 22:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表