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

使用Python編寫(xiě)錄屏錄音工具

 更新時(shí)間:2024年12月31日 10:53:43   作者:hvinsion  
這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫(xiě)一個(gè)錄屏錄音工具,工具界面十分簡(jiǎn)單,默認(rèn)是全屏錄屏錄音,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1.簡(jiǎn)介

工具界面十分簡(jiǎn)單,默認(rèn)是全屏錄屏錄音(第一次使用得手動(dòng)開(kāi)啟電腦聲音設(shè)置的立體聲混音作為輸入),勾選不錄制揚(yáng)聲器系統(tǒng)聲音后只錄屏,如果想自定義區(qū)域錄制要先選擇自定義區(qū)域錄屏,然后再點(diǎn)擊開(kāi)始錄制即可。

2.運(yùn)行界面

可勾不錄制揚(yáng)聲器系統(tǒng)聲音

選擇錄制區(qū)域再點(diǎn)擊開(kāi)始錄制

3.相關(guān)源碼

import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as messagebox
import pyautogui
import cv2
import numpy as np
from datetime import datetime
import threading
import pyaudio
import wave
import os
from moviepy.editor import VideoFileClip, AudioFileClip
 
# 隱藏命令行
import win32console
import win32gui
win = win32console.GetConsoleWindow()
win32gui.ShowWindow(win, 0)
 
class Popup(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("設(shè)置")
        self.geometry("300x250")
        self.configure(bg="#333333")
        self.create_widgets()
        self.recording_area = None  # 初始化錄制區(qū)域
        self.record_microphone = True  # 初始化打開(kāi)麥克風(fēng)
 
    def create_widgets(self):
        self.recording = False
        self.stop_event = threading.Event()  # 使用 Event 對(duì)象
 
        self.rec_button = tk.Button(self, text="開(kāi)始錄制", command=self.toggle_recording, bg="#333333", fg="white", borderwidth=2, relief="solid")
        self.rec_button.pack(pady=10)
 
        self.stop_button = tk.Button(self, text="停止錄制", command=self.stop_recording, bg="#333333", fg="white", borderwidth=2, relief="solid", state=tk.DISABLED)
        self.stop_button.pack(pady=5)
 
        # 區(qū)域選擇按鈕
        self.select_area_button = tk.Button(self, text="選擇錄制區(qū)域", command=self.select_area, bg="#333333", fg="white", borderwidth=2, relief="solid")
        self.select_area_button.pack(pady=10)
 
        # 揚(yáng)聲器錄制選項(xiàng)
        self.mic_checkbox = tk.Checkbutton(self, text="不錄制揚(yáng)聲器系統(tǒng)聲音", command=self.toggle_microphone, bg="#333333", fg="white", selectcolor="black")
        self.mic_checkbox.pack(pady=10)
 
    def toggle_microphone(self):
        # 切換麥克風(fēng)錄制的狀態(tài)
        self.record_microphone = not self.record_microphone
 
    def select_area(self):
        # 打開(kāi)一個(gè)全屏窗口,允許用戶通過(guò)鼠標(biāo)拖動(dòng)選擇區(qū)域
        self.selection_window = tk.Toplevel(self)
        self.selection_window.attributes('-fullscreen', True)
        self.selection_window.attributes('-alpha', 0.3)  # 半透明
        self.selection_window.config(bg="gray")
 
        self.canvas = tk.Canvas(self.selection_window, cursor="cross", bg="gray")
        self.canvas.pack(fill="both", expand=True)
 
        self.rect_id = None
        self.start_x = None
        self.start_y = None
 
        # 綁定鼠標(biāo)事件
        self.canvas.bind("<ButtonPress-1>", self.on_mouse_down)
        self.canvas.bind("<B1-Motion>", self.on_mouse_drag)
        self.canvas.bind("<ButtonRelease-1>", self.on_mouse_up)
 
    def on_mouse_down(self, event):
        # 記錄起點(diǎn)
        self.start_x = event.x
        self.start_y = event.y
        self.rect_id = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='red', width=2)
 
    def on_mouse_drag(self, event):
        # 動(dòng)態(tài)更新矩形
        self.canvas.coords(self.rect_id, self.start_x, self.start_y, event.x, event.y)
 
    def on_mouse_up(self, event):
        # 記錄終點(diǎn)并計(jì)算區(qū)域
        end_x = event.x
        end_y = event.y
        self.recording_area = (self.start_x, self.start_y, end_x - self.start_x, end_y - self.start_y)
        self.selection_window.destroy()
        messagebox.showinfo("信息", f"選擇的錄制區(qū)域?yàn)椋簕self.recording_area}")
 
    def toggle_recording(self):
        if not self.recording:
            self.start_recording()
        else:
            self.stop_recording()
 
    def start_recording(self):
        self.recording = True
        self.stop_event.clear()  # 清除事件狀態(tài)
        frame_rate = 30
        timestamp = self.get_current_timestamp()
        self.video_filename = f"recorded_video_{timestamp}.mp4"
        self.audio_filename = f"recorded_audio_{timestamp}.wav"
 
        if self.recording_area is None:
            screen_width, screen_height = pyautogui.size()
            self.recording_area = (0, 0, screen_width, screen_height)  # 默認(rèn)全屏
 
        codec = cv2.VideoWriter_fourcc(*"mp4v")
        self.video_out = cv2.VideoWriter(self.video_filename, codec, frame_rate, (self.recording_area[2], self.recording_area[3]))
 
        # 判斷是否需要錄制麥克風(fēng)
        if self.record_microphone:
            # 聲音錄制線程
            self.audio_thread = threading.Thread(target=self.record_audio, args=(self.audio_filename,))
            self.audio_thread.start()
 
        # 啟動(dòng)錄制線程
        self.recording_thread = threading.Thread(target=self.record_screen)
        self.recording_thread.start()
 
        self.rec_button.config(text="正在錄制", state=tk.DISABLED)
        self.stop_button.config(state=tk.NORMAL)
 
    def record_screen(self):
        while not self.stop_event.is_set():  # 檢查事件狀態(tài)
            img = pyautogui.screenshot(region=self.recording_area)  # 錄制自定義區(qū)域
            frame = np.array(img)
            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
            self.video_out.write(frame)
 
        self.video_out.release()
        print("視頻錄制結(jié)束")
 
    def record_audio(self, filename):
        chunk = 1024
        sample_format = pyaudio.paInt16
        channels = 2
        fs = 44100  # 采樣頻率
 
        p = pyaudio.PyAudio()
 
        # 打開(kāi)麥克風(fēng)輸入流
        stream = p.open(format=sample_format,
                        channels=channels,
                        rate=fs,
                        input=True,
                        frames_per_buffer=chunk)
 
        frames = []
 
        while not self.stop_event.is_set():  # 檢查事件狀態(tài)
            data = stream.read(chunk)
            frames.append(data)
 
        stream.stop_stream()
        stream.close()
        p.terminate()
 
        # 保存音頻到 wav 文件
        with wave.open(filename, 'wb') as wf:
            wf.setnchannels(channels)
            wf.setsampwidth(p.get_sample_size(sample_format))
            wf.setframerate(fs)
            wf.writeframes(b''.join(frames))
 
        print("錄音結(jié)束")
 
    def stop_recording(self):
        self.recording = False
        self.stop_event.set()  # 設(shè)定事件,結(jié)束錄制
 
        if self.record_microphone:
            self.audio_thread.join()  # 等待音頻線程結(jié)束
 
        if os.path.isfile('merged_video.mp4'):
            messagebox.showinfo("提示", "合并視頻文件已保存至當(dāng)前目錄文件夾,想重新錄制請(qǐng)刪除原文件后重試!")
            # 更新按鈕狀態(tài)
            self.rec_button.config(text="請(qǐng)刪除原文件后再開(kāi)始錄制", state=tk.NORMAL)
            self.stop_button.config(state=tk.DISABLED)
        else:
            # 合成音視頻
            self.merge_audio_video()
 
    def merge_audio_video(self):
        merge_file = 'merged_video.mp4'
 
        video_clip = VideoFileClip(self.video_filename)
 
        if self.record_microphone:
            audio_clip = AudioFileClip(self.audio_filename)
            final_clip = video_clip.set_audio(audio_clip)
        else:
            final_clip = video_clip  # 如果沒(méi)有錄音,只保存視頻
 
        final_clip.write_videofile(merge_file, codec='libx264', audio_codec="aac")
 
        # 刪除錄制的視頻文件和音頻文件
        os.remove(self.video_filename)
        if self.record_microphone:
            os.remove(self.audio_filename)
 
        print("音視頻合成完成,存儲(chǔ)為", merge_file)
        # 更新按鈕狀態(tài)
        self.rec_button.config(text="開(kāi)始錄制", state=tk.NORMAL)
        self.stop_button.config(state=tk.DISABLED)
 
    def get_current_timestamp(self):
        return datetime.now().strftime("%Y%m%d_%H%M%S")
 
if __name__ == "__main__":
    popup = Popup()
    popup.mainloop()

以上就是使用Python編寫(xiě)錄屏錄音工具的詳細(xì)內(nèi)容,更多關(guān)于Python錄屏錄音的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python單星號(hào)(*)與雙星號(hào)(**)使用示例demo

    python單星號(hào)(*)與雙星號(hào)(**)使用示例demo

    這篇文章詳細(xì)介紹了Python中*與**操作符的使用場(chǎng)景及注意事項(xiàng),并通過(guò)示例代碼展示了它們?cè)诤瘮?shù)形參和實(shí)參、序列解包以及函數(shù)參數(shù)順序中的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • Pyecharts地圖顯示不完成問(wèn)題解決方案

    Pyecharts地圖顯示不完成問(wèn)題解決方案

    這篇文章主要介紹了Pyecharts地圖顯示不完成問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • pandas中std和numpy的np.std區(qū)別及說(shuō)明

    pandas中std和numpy的np.std區(qū)別及說(shuō)明

    這篇文章主要介紹了pandas中std和numpy的np.std區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python實(shí)現(xiàn)MySQL操作的方法小結(jié)【安裝,連接,增刪改查等】

    Python實(shí)現(xiàn)MySQL操作的方法小結(jié)【安裝,連接,增刪改查等】

    這篇文章主要介紹了Python實(shí)現(xiàn)MySQL操作的方法,結(jié)合實(shí)例形式分析了Python針對(duì)mysql的安裝,連接,增刪改查等操作實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • Pycharm代碼無(wú)法復(fù)制,無(wú)法選中刪除,無(wú)法編輯的解決方法

    Pycharm代碼無(wú)法復(fù)制,無(wú)法選中刪除,無(wú)法編輯的解決方法

    今天小編就為大家分享一篇Pycharm代碼無(wú)法復(fù)制,無(wú)法選中刪除,無(wú)法編輯的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地的方法

    使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地的方法

    開(kāi)發(fā)一個(gè)自動(dòng)化工具,用于從JSON數(shù)據(jù)源中提取圖像ID,通過(guò)調(diào)用指定API獲取未經(jīng)壓縮的原始圖像文件,并確保下載結(jié)果與Postman等工具直接調(diào)用API獲取的文件完全一致,下面給大家介紹使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地的方法,感興趣的朋友一起看看吧
    2025-05-05
  • Django中反向生成models.py的實(shí)例講解

    Django中反向生成models.py的實(shí)例講解

    今天小編就為大家分享一篇Django中反向生成models.py的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 詳解Python中的正斜杠與反斜杠

    詳解Python中的正斜杠與反斜杠

    這篇文章主要介紹了詳解Python中的正斜杠與反斜杠,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 深入理解Python虛擬機(jī)之進(jìn)程、線程和協(xié)程區(qū)別詳解

    深入理解Python虛擬機(jī)之進(jìn)程、線程和協(xié)程區(qū)別詳解

    在本篇文章當(dāng)中深入分析在 Python 當(dāng)中 進(jìn)程、線程和協(xié)程的區(qū)別,這三個(gè)概念會(huì)讓人非常迷惑,如果沒(méi)有深入了解這三者的實(shí)現(xiàn)原理,只是看一些文字說(shuō)明,也很難理解,在本篇文章當(dāng)中我們將通過(guò)分析部分源代碼來(lái)詳細(xì)分析一下這三者根本的區(qū)別是什么,需要的朋友可以參考下
    2023-10-10
  • python代碼實(shí)現(xiàn)檢測(cè)并自動(dòng)啟動(dòng)指定exe程序

    python代碼實(shí)現(xiàn)檢測(cè)并自動(dòng)啟動(dòng)指定exe程序

    這篇文章主要為大家詳細(xì)介紹了如何Python代碼實(shí)現(xiàn)一個(gè)檢測(cè)并自動(dòng)啟動(dòng)指定exe程序的功能,主要使用psutil庫(kù)檢測(cè)進(jìn)程是否存在,如果未運(yùn)行則通過(guò)subprocess啟動(dòng)程序,感興趣的小伙伴可以了解下
    2026-03-03

最新評(píng)論

宁国市| 玛曲县| 昌邑市| 乌鲁木齐县| 邢台县| 霍林郭勒市| 赣州市| 禹城市| 肥西县| 佳木斯市| 昆山市| 延边| 景东| 铜梁县| 新兴县| 高唐县| 宣武区| 陇南市| 武隆县| 林西县| 琼结县| 鸡东县| 永平县| 阿拉善右旗| 佛学| 宝丰县| 会宁县| 桐柏县| 黔东| 武冈市| 特克斯县| 安乡县| 行唐县| 庆元县| 德江县| 阿图什市| 进贤县| 治县。| 白水县| 山西省| 安远县|