最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python實(shí)現(xiàn)屏幕錄制與鍵盤監(jiān)聽功能

 更新時(shí)間:2024年12月26日 10:49:26   作者:Leuanghing  
在Python中,我們可以借助多個(gè)強(qiáng)大的庫來實(shí)現(xiàn)豐富的功能,比如屏幕錄制和鍵盤監(jiān)聽,今天,我們將通過結(jié)合PIL、OpenCV、pynput以及threading等庫,來實(shí)現(xiàn)一個(gè)簡單的屏幕錄制工具,該工具能夠通過監(jiān)聽鍵盤事件來控制錄制的開始與結(jié)束,需要的朋友可以參考下

一、引言

在Python中,我們可以借助多個(gè)強(qiáng)大的庫來實(shí)現(xiàn)豐富的功能,比如屏幕錄制和鍵盤監(jiān)聽。今天,我們將通過結(jié)合PIL(Python Imaging Library的分支Pillow)、OpenCV、pynput以及threading等庫,來實(shí)現(xiàn)一個(gè)簡單的屏幕錄制工具,該工具能夠通過監(jiān)聽鍵盤事件來控制錄制的開始與結(jié)束。

二、所需庫介紹

  • PIL(Pillow):用于屏幕截圖。
  • OpenCV:用于視頻文件的創(chuàng)建與寫入。
  • pynput:用于監(jiān)聽鍵盤事件。
  • threading:用于并行執(zhí)行代碼,實(shí)現(xiàn)屏幕錄制與鍵盤監(jiān)聽的同時(shí)進(jìn)行。

三、代碼詳解

導(dǎo)入所需庫

import time
import threading
from datetime import datetime
from PIL import ImageGrab
import numpy as np
from cv2.cv2 import cvtColor, VideoWriter_fourcc, VideoWriter, COLOR_RGB2BGR, VideoCapture, \
                  CAP_PROP_FPS, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
from pynput import keyboard

定義視頻錄制函數(shù)

def video_record():
    # ...(省略了部分代碼)
    while True:
        if flag:
            # ...(省略了部分代碼)
            break
        im = ImageGrab.grab()  # 截圖
        imm = cvtColor(np.array(im), COLOR_RGB2BGR)  # 轉(zhuǎn)換顏色模式
        video.write(imm)  # 寫入視頻文件
  • 這個(gè)函數(shù)首先獲取當(dāng)前時(shí)間作為文件名,然后初始化視頻寫入對象。接著,它會顯示一個(gè)3秒的倒計(jì)時(shí),之后開始錄制屏幕。在錄制過程中,它會不斷檢查一個(gè)全局變量flag,如果flag變?yōu)?code>True,則停止錄制并釋放視頻寫入對象。

定義鍵盤監(jiān)聽函數(shù)

def on_press(key):
    global flag
    if key == keyboard.Key.esc:
        flag = True
        return False
  • 這個(gè)函數(shù)會監(jiān)聽鍵盤事件,當(dāng)按下esc鍵時(shí),將全局變量flag設(shè)置為True,并返回False以停止鍵盤監(jiān)聽。

定義視頻信息打印函數(shù)

def video_info():
    # ...(省略了部分代碼)
    print('幀率=%.1f' % fps)
    # ...(省略了部分代碼)
    print('推薦幀率=%.2f' % (fps*((int(count)/fps)/(final_time-start_time))))
  • 這個(gè)函數(shù)會在錄制結(jié)束后讀取視頻文件的信息,包括幀率、幀數(shù)、分辨率以及錄制時(shí)間等,并打印出來。同時(shí),它還會計(jì)算并打印一個(gè)推薦幀率,這個(gè)推薦幀率是基于實(shí)際錄制時(shí)間與視頻文件中的幀數(shù)計(jì)算得出的。

主函數(shù)

if __name__ == '__main__':
    flag = False
    th = threading.Thread(target=video_record)
    th.start()

    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

    time.sleep(1)  # 等待視頻釋放過后
    video_info()
  • 在主函數(shù)中,我們首先初始化全局變量flag為False,然后創(chuàng)建一個(gè)線程來運(yùn)行video_record函數(shù)。接著,我們使用pynput庫的keyboard.Listener來監(jiān)聽鍵盤事件,并將on_press函數(shù)作為回調(diào)函數(shù)。當(dāng)鍵盤監(jiān)聽結(jié)束時(shí)(即按下esc鍵后),主線程會等待1秒以確保視頻文件被正確釋放,然后調(diào)用video_info函數(shù)來打印視頻信息。

四、完整代碼

#!/usr/bin/env python
# -*- coding = utf-8 -*-
# @Time : 2021/10/6 17:43
# @Author : Leuanghing Chen
# @Blog : https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421
# @File : python實(shí)現(xiàn)錄屏功能.py
# @Software : PyCharm
# 發(fā)布程序:pyinstaller -F -w -i F:\python_demo\2.ico F:\python_demo\python實(shí)現(xiàn)錄屏功能.py

import time
import threading
from datetime import datetime
from PIL import ImageGrab
import numpy as np
from cv2.cv2 import cvtColor, VideoWriter_fourcc, VideoWriter, COLOR_RGB2BGR, VideoCapture,\
                    CAP_PROP_FPS, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
from pynput import keyboard


# 錄入視頻
def video_record():
    # 加了global,則可以在函數(shù)內(nèi)部對函數(shù)外的對象進(jìn)行操作了,也可以改變它的值了
    global name
    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')               # 當(dāng)前的時(shí)間(當(dāng)文件名)
    screen = ImageGrab.grab()                                         # 獲取當(dāng)前屏幕
    width, high = screen.size                                         # 獲取當(dāng)前屏幕的大小
    fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D')                   # MPEG-4編碼,文件后綴可為.avi .asf .mov等
    video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high))   # (文件名,編碼器,幀率,視頻寬高)
    for i in range(3):
        time.sleep(1)
        print("倒計(jì)時(shí):{}".format(3-i))
    print('開始錄制!')
    global start_time
    start_time = time.time()

    while True:
        if flag:
            print("錄制結(jié)束!")
            global final_time
            final_time = time.time()
            video.release()                                     # 釋放
            break
        im = ImageGrab.grab()  # 圖片為RGB模式
        imm = cvtColor(np.array(im), COLOR_RGB2BGR)             # 轉(zhuǎn)為opencv的BGR模式
        video.write(imm)                                        # 寫入
        # time.sleep(5)                                         # 等待5秒再次循環(huán)


# 結(jié)束監(jiān)聽按鍵,按下esc結(jié)束錄屏
def on_press(key):
    global flag
    # esc鍵
    if key == keyboard.Key.esc:
        flag = True                                             # 改變
        return False                                            # 返回False,鍵盤監(jiān)聽結(jié)束!


# 視頻信息
def video_info():
    video = VideoCapture('%s.avi' % name)                       # 記得文件名加格式不要錯(cuò)!
    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('幀數(shù)=%.1f' % count)
    print('分辨率', size)
    print('視頻時(shí)間=%.3f秒' % (int(count)/fps))
    print('錄制時(shí)間=%.3f秒' % (final_time-start_time))
    print('推薦幀率=%.2f' % (fps*((int(count)/fps)/(final_time-start_time))))


if __name__ == '__main__':
    flag = False
    th = threading.Thread(target=video_record)
    th.start()

    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

    time.sleep(1)  # 等待視頻釋放過后
    video_info()

五、總結(jié)

通過結(jié)合多個(gè)Python庫,我們實(shí)現(xiàn)了一個(gè)簡單的屏幕錄制工具,該工具能夠?qū)崟r(shí)錄制屏幕并通過監(jiān)聽鍵盤事件來控制錄制的開始與結(jié)束。這個(gè)工具不僅可以用于個(gè)人娛樂或?qū)W習(xí),還可以作為開發(fā)屏幕錄制功能應(yīng)用程序的基礎(chǔ)。希望這篇博文能幫助你更好地理解如何使用Python來實(shí)現(xiàn)屏幕錄制與鍵盤監(jiān)聽功能。

以上就是使用Python實(shí)現(xiàn)屏幕錄制與鍵盤監(jiān)聽功能的詳細(xì)內(nèi)容,更多關(guān)于Python屏幕錄制與鍵盤監(jiān)聽的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python中如何利用matplotlib畫多個(gè)并列的柱狀圖

    python中如何利用matplotlib畫多個(gè)并列的柱狀圖

    python是一個(gè)很有趣的語言,可以在命令行窗口運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于python中如何利用matplotlib畫多個(gè)并列的柱狀圖的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • python 按不同維度求和,最值,均值的實(shí)例

    python 按不同維度求和,最值,均值的實(shí)例

    今天小編就為大家分享一篇python 按不同維度求和,最值,均值的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python用win32gui遍歷窗口并設(shè)置窗口位置的方法

    python用win32gui遍歷窗口并設(shè)置窗口位置的方法

    今天小編就為大家分享一篇python用win32gui遍歷窗口并設(shè)置窗口位置的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python實(shí)現(xiàn)的連接mssql數(shù)據(jù)庫操作示例

    Python實(shí)現(xiàn)的連接mssql數(shù)據(jù)庫操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的連接mssql數(shù)據(jù)庫操作,結(jié)合實(shí)例形式分析了Python安裝pymssql模塊以及基于pymssql模塊連接sql2008 R2數(shù)據(jù)庫的具體操作技巧,需要的朋友可以參考下
    2018-08-08
  • python 數(shù)據(jù)類(dataclass)的具體使用

    python 數(shù)據(jù)類(dataclass)的具體使用

    本文主要介紹了python 數(shù)據(jù)類(dataclass)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • pytorch如何實(shí)現(xiàn)多個(gè)矩陣拼接

    pytorch如何實(shí)現(xiàn)多個(gè)矩陣拼接

    這篇文章主要介紹了pytorch如何實(shí)現(xiàn)多個(gè)矩陣拼接問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python使用cx_Oracle調(diào)用Oracle存儲過程的方法示例

    Python使用cx_Oracle調(diào)用Oracle存儲過程的方法示例

    這篇文章主要介紹了Python使用cx_Oracle調(diào)用Oracle存儲過程的方法,結(jié)合具體實(shí)例分析了Python中通過cx_Oracle調(diào)用PL/SQL的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • python3.6中@property裝飾器的使用方法示例

    python3.6中@property裝飾器的使用方法示例

    這篇文章主要介紹了python3.6中@property裝飾器的使用方法,結(jié)合實(shí)例形式分析了python3.6中@property裝飾器的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Python bsonrpc源碼解讀

    Python bsonrpc源碼解讀

    這篇文章主要介紹了Python bsonrpc源碼的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python中偏函數(shù)partial用法實(shí)例分析

    python中偏函數(shù)partial用法實(shí)例分析

    這篇文章主要介紹了python中偏函數(shù)partial用法,實(shí)例分析了偏函數(shù)partial的功能、定義及使用方法,需要的朋友可以參考下
    2015-07-07

最新評論

宜州市| 象州县| 水城县| 喀喇| 五莲县| 固镇县| 铁岭市| 赞皇县| 碌曲县| 晋宁县| 扎囊县| 河西区| 沁源县| 蒲江县| 治县。| 中山市| 平山县| 安塞县| 施秉县| 滨州市| 扎赉特旗| 西峡县| 曲阜市| 潼南县| 郓城县| 陇南市| 股票| 云浮市| 禄丰县| 闽侯县| 米泉市| 尚义县| 邳州市| 绥德县| 尼勒克县| 浪卡子县| 岳西县| 玛多县| 天柱县| 北流市| 顺昌县|