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

使用Python編寫錄屏錄音工具

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

1.簡介

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

2.運行界面

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

選擇錄制區(qū)域再點擊開始錄制

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  # 初始化打開麥克風(fēng)
 
    def create_widgets(self):
        self.recording = False
        self.stop_event = threading.Event()  # 使用 Event 對象
 
        self.rec_button = tk.Button(self, text="開始錄制", 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)
 
        # 揚聲器錄制選項
        self.mic_checkbox = tk.Checkbutton(self, text="不錄制揚聲器系統(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):
        # 打開一個全屏窗口,允許用戶通過鼠標(biāo)拖動選擇區(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):
        # 記錄起點
        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):
        # 動態(tài)更新矩形
        self.canvas.coords(self.rect_id, self.start_x, self.start_y, event.x, event.y)
 
    def on_mouse_up(self, event):
        # 記錄終點并計算區(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ū)域為:{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()
 
        # 啟動錄制線程
        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()
 
        # 打開麥克風(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)前目錄文件夾,想重新錄制請刪除原文件后重試!")
            # 更新按鈕狀態(tài)
            self.rec_button.config(text="請刪除原文件后再開始錄制", 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  # 如果沒有錄音,只保存視頻
 
        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("音視頻合成完成,存儲為", merge_file)
        # 更新按鈕狀態(tài)
        self.rec_button.config(text="開始錄制", 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編寫錄屏錄音工具的詳細(xì)內(nèi)容,更多關(guān)于Python錄屏錄音的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

    Pyecharts地圖顯示不完成問題解決方案

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

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

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

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

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

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

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

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

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

    Django中反向生成models.py的實例講解

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

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

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

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

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

    python代碼實現(xiàn)檢測并自動啟動指定exe程序

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

最新評論

河东区| 灯塔市| 涪陵区| 清远市| 栾川县| 酉阳| 高雄市| 焉耆| 邓州市| 吕梁市| 福贡县| 宁晋县| 石门县| 阿坝| 南城县| 稻城县| 砀山县| 浪卡子县| 海丰县| 手游| 乌拉特后旗| 尚义县| 玉环县| 长顺县| 江城| 邳州市| 洛宁县| 安龙县| 锦屏县| 江川县| 雅江县| 揭东县| 湘潭县| 新化县| 奇台县| 札达县| 富平县| 阿拉尔市| 张家口市| 霞浦县| 开原市|