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

用Python進行屏幕錄制的實現(xiàn)

 更新時間:2024年04月18日 10:14:04   作者:鵝毛在路上了  
關(guān)于屏幕錄制這個功能需求,之前用過基于ffmpeg的Capture錄屏軟件,但是fps拉高以后會變得很卡,聲音也同樣出現(xiàn)卡頓,所以本文給大家介紹了用Python進行屏幕錄制的實現(xiàn),感興趣的朋友可以參考下

引言

關(guān)于屏幕錄制這個功能需求,之前用過基于ffmpeg的Capture錄屏軟件,但是fps拉高以后會變得很卡,聲音也同樣出現(xiàn)卡頓。也自己嘗試過在python中調(diào)用ffmpeg的庫函數(shù),效果也不盡人意。網(wǎng)絡(luò)上下載了幾款錄屏軟件,不是要收費就是下載到捆綁軟件或廣告很是心累,因此想借此機會重新研究一下屏幕錄制軟件的工作原理,同時當作一個小項目練手。

gpt3.5給出的代碼

當我還在猶豫是否要精心翻閱一下ffmpeg的說明書時,沒想到gpt已果斷給出了參考答案,可以使用Python的PyAutoGUI庫來實現(xiàn)錄屏功能。以下是一個簡單的示例代碼:

import pyautogui
import cv2
import numpy as np

# 獲取屏幕分辨率
screen_size = (1920, 1080)

# 設(shè)置視頻編碼器
fourcc = cv2.VideoWriter_fourcc(*"XVID")

# 創(chuàng)建視頻寫入對象
out = cv2.VideoWriter("output.avi", fourcc, 20.0, screen_size)

# 開始錄屏
while True:
    # 獲取屏幕截圖
    img = pyautogui.screenshot()

    # 將截圖轉(zhuǎn)換為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環(huán)境里運行后,果然不出意外的話就要出意外了。gpt3.5給出的代碼卡在運行中的界面紋絲不動,按’q’回車也并未退出循環(huán),再問gpt也死活給不出修改方案。

查閱資料后發(fā)現(xiàn)要先imshow()之后,在ui窗口區(qū)域內(nèi)按鍵才能有效終止循環(huán):

import numpy as np
import pyautogui
import cv2

# 設(shè)置錄制參數(shù)
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()
    # 轉(zhuǎn)換為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()

程序是能運行了,但是效果依舊不好,窗口一直有遞歸的效果,而且導出的視頻其實是無法播放的。

在這里插入圖片描述

更換截圖函數(shù)——ImageGrab.grab

pyautogui雖然能實現(xiàn)截圖,并在imshow里展示出來,但是導出的視頻卻無法播放,考慮肯能涉及到具體視頻編解碼參數(shù)問題,有懂的朋友請在評論區(qū)分享。這里采用更換PIL庫中的截圖函數(shù)ImageGrab.grab,可以實現(xiàn)截圖并導出視頻了,接下來最大的問題就是解決遞歸現(xiàn)象。

import numpy as np
import pyautogui
import cv2

# 設(shè)置錄制參數(shù)
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()
    # 轉(zhuǎn)換為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解決遞歸現(xiàn)象

視頻處理時的遞歸現(xiàn)象其實非常常見,除了物理中的鏡面效應(yīng)(觀察兩個平行放置的鏡子會出現(xiàn)遞歸的現(xiàn)象),

將攝像頭對準顯示器,顯示器上的畫面也會觀察到遞歸的現(xiàn)象:

在這里插入圖片描述

經(jīng)嘗試,將imshow()禁用后,改為幀計數(shù)的方式自定義終止循環(huán)就不會出現(xiàn)遞歸的問題了:

import numpy as np
from PIL import ImageGrab
import cv2

# 設(shè)置錄制參數(shù)
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..')
    # 轉(zhuǎn)換為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

    cnt = cnt + 1

    if cnt == 100:  #滿100幀后終止循環(huán)
        break

# 停止錄制
out.release()
cv2.destroyAllWindows()

在這里插入圖片描述

通過修改img = ImageGrab.grab(bbox=(0, 0, 2560, 1600))中的參數(shù)可以自定義錄屏區(qū)域,x,y,w,h分別代表左上角坐標(起始坐標)和圖片寬度、高度。比如我的屏幕分辨率是2560*1600,那么設(shè)置為0, 0, 2560, 1600就是錄制全屏:

在這里插入圖片描述

這樣,我們就可以基本實現(xiàn)用Python進行屏幕錄制的功能了。動態(tài)圖預(yù)覽看上去分辨率不高是因為用的格式工廠把錄制的視頻轉(zhuǎn)了gif,壓縮前錄制的視頻其實蠻清楚的。

通過修改fps的值,我們還可以自行錄制一些高刷新率的電影、游戲畫面,fps越高,畫面越流暢哦。

攝像頭錄制代碼

類似的,也可以用python實現(xiàn)相機錄像的功能:

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))  #設(shè)置文件名,fps,分辨率

while cap.isOpened():

    res, frame = cap.read()
    if not res:
        print("Frame Cannot Be Received")
        break

    # Flipping the frame horizontally to get correct orientation
    frame = cv2.flip(frame, 90)

    # Displaying the current frame
    output.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 loop
    if cv2.waitKey(1) == ord('x'):
        break

# Releasing everything after coming out of loop
cap.release()
output.release()
cv2.destroyAllWindows()

后期需求

現(xiàn)在屏幕錄制的問題基本解決了,要想做一個實用的屏幕錄制軟件,還需要加上音頻錄制,并設(shè)計一個便捷的UI界面。

小結(jié)

到此這篇關(guān)于用Python進行屏幕錄制的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python屏幕錄制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python3顯式變量類型typing的實現(xiàn)

    python3顯式變量類型typing的實現(xiàn)

    這篇文章主要介紹了python3顯式變量類型typing的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Python實現(xiàn)上課點名器系統(tǒng)

    Python實現(xiàn)上課點名器系統(tǒng)

    今天給大家分享一個讀者粉絲投稿的,關(guān)于上課點名的實戰(zhàn)案例,對Python上課點名器實現(xiàn)過程感興趣的朋友,一起來看看是如何實現(xiàn)的吧
    2021-10-10
  • pycharm 取消默認的右擊運行unittest的方法

    pycharm 取消默認的右擊運行unittest的方法

    今天小編就為大家分享一篇pycharm 取消默認的右擊運行unittest的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python數(shù)據(jù)類型和常用操作

    Python數(shù)據(jù)類型和常用操作

    這篇文章主要介紹了Python數(shù)據(jù)類型和常用操作,數(shù)值數(shù)據(jù)類型用于存儲數(shù)值,數(shù)據(jù)類型不可改變,改變會分配一個新的對象,下文更多相關(guān)內(nèi)容介紹需要的小伙伴可以參考一下
    2022-04-04
  • python實現(xiàn)計數(shù)排序與桶排序?qū)嵗a

    python實現(xiàn)計數(shù)排序與桶排序?qū)嵗a

    這篇文章主要介紹了python計數(shù)排序與桶排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • python logging類庫使用例子

    python logging類庫使用例子

    這篇文章主要介紹了python logging類庫使用例子,本文講解了簡單使用、logging的level、Handlers、FileHandler + StreamHandler等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Python機器學習NLP自然語言處理基本操作關(guān)鍵詞

    Python機器學習NLP自然語言處理基本操作關(guān)鍵詞

    本文是Python機器學習NLP自然語言處理系列文章,帶大家開啟一段學習自然語言處理 (NLP) 的旅程. 本文主要學習NLP自然語言處理關(guān)鍵詞的操作
    2021-09-09
  • python輸出后面多一個None問題

    python輸出后面多一個None問題

    在Python中,函數(shù)如果沒有顯式指定返回值,會默認返回`None`,例如,計算一個數(shù)的平方根并輸出,如果沒有處理`None`,會輸出結(jié)果后跟`None`
    2024-11-11
  • python如何實現(xiàn)DES加密

    python如何實現(xiàn)DES加密

    這篇文章主要介紹了python如何實現(xiàn)DES加密,幫助大家更好的理解和學習密碼學,感興趣的朋友可以了解下
    2020-09-09
  • Python實現(xiàn)CET查分的方法

    Python實現(xiàn)CET查分的方法

    這篇文章主要介紹了Python實現(xiàn)CET查分的方法,實例分析了Python操作鏈接查詢的技巧,需要的朋友可以參考下
    2015-03-03

最新評論

全南县| 伊吾县| 专栏| 万安县| 平果县| 岳阳县| 兴国县| 长寿区| 岑溪市| 汝城县| 舒城县| 女性| 开化县| 九龙县| 安乡县| 普洱| 通州市| 马关县| 桂阳县| 澄江县| 靖宇县| 镇江市| 乳山市| 商河县| 桃园市| 宣汉县| 富宁县| 南部县| 莒南县| 大丰市| 宜君县| 商洛市| 淄博市| 肃宁县| 岳池县| 五寨县| 兴仁县| 九龙县| 教育| 越西县| 周宁县|