惊现编程「降维打击」:CodeBuddy 把录屏录音工具开发玩成「搭积木」

举报
Undoom 发表于 2025/05/25 13:41:43 2025/05/25
【摘要】 前言在日常工作与生活中,录屏录音工具的使用场景极为广泛。无论是制作教学视频、记录会议内容,还是分享游戏精彩瞬间,一款功能完备的录屏录音工具都能带来极大便利。然而,当我深入探究市场上现有的这类工具时,却发现诸多痛点。​传统录屏软件常常出现卡顿现象,尤其是在录制高清内容或者进行长时间录制时,画面的不流畅严重影响了录制效果。录制权限限制也让人头疼不已,部分软件在特定系统环境下无法获取完整权限,导致...

前言

在日常工作与生活中,录屏录音工具的使用场景极为广泛。无论是制作教学视频、记录会议内容,还是分享游戏精彩瞬间,一款功能完备的录屏录音工具都能带来极大便利。然而,当我深入探究市场上现有的这类工具时,却发现诸多痛点。​

传统录屏软件常常出现卡顿现象,尤其是在录制高清内容或者进行长时间录制时,画面的不流畅严重影响了录制效果。录制权限限制也让人头疼不已,部分软件在特定系统环境下无法获取完整权限,导致无法正常录制某些重要内容。音画不同步更是一大顽疾,这使得录制的视频在观看时体验大打折扣。而且,许多录屏录音工具在后期编辑方面功能匮乏,无法满足对视频进行精细剪辑、添加特效等需求。​

基于这些痛点,我萌生了开发一款专属录屏录音工具的想法,期望能打造出一款流畅、权限自由、音画同步且具备强大后期编辑功能的工具。而在开发过程中,选择合适的编程辅助工具至关重要,这便是我将目光投向 CodeBuddy 的原因。​

CodeBuddy 的 AI 编程代码功能十分强大,为我的开发工作提供了诸多助力。它基于腾讯混元与 DeepSeek 双轮模型驱动,在代码生成方面表现卓越。以编写录屏录音工具为例,当我需要实现特定的录制功能代码时,只需在 CodeBuddy 中用自然语言描述需求,比如 “实现高清流畅录屏功能,帧率稳定在 60 帧”,它就能快速生成相应的代码框架,甚至是具体的代码片段,极大地节省了从无到有编写代码的时间。​

使用CodeBuddy从0到一生成录屏录音软件

我们先打开vscode进入到拓展中直接搜索CodeBuddy,点击安装这个插件就行了

点击拓展的图标就能进行使用了
我们先在chat模式生成下相关的README文件,方便后续代码的生成

这里可以看得出生成的还是比较详细的,我们直接复制到我们自己创建的README文件里面去了
我们直接在Craft模式下艾特上我们的README文件进行代码的生成
这里分析的还是比较透彻的

这里我们经过了几轮简单的对话就实现了下面的功能

可勾不录制扬声器系统声音


  • 录制完成后会自动生成一个名为"merged_video.mp4"的文件
  • 文件将保存在当前目录下
    代码如下;
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("设置")

        self.geometry("300x250")

        self.configure(bg="#333333")

        self.create_widgets()

        self.recording_area = None  # 初始化录制区域

        self.record_microphone = True  # 初始化打开麦克风

    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)

        # 区域选择按钮

        self.select_area_button = tk.Button(self, text="选择录制区域", 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="不录制扬声器系统声音", command=self.toggle_microphone, bg="#333333", fg="white", selectcolor="black")

        self.mic_checkbox.pack(pady=10)

    def toggle_microphone(self):

        # 切换麦克风录制的状态

        self.record_microphone = not self.record_microphone

    def select_area(self):

        # 打开一个全屏窗口,允许用户通过鼠标拖动选择区域

        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

        # 绑定鼠标事件

        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):

        # 动态更新矩形

        self.canvas.coords(self.rect_id, self.start_x, self.start_y, event.x, event.y)

    def on_mouse_up(self, event):

        # 记录终点并计算区域

        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"选择的录制区域为:{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()  # 清除事件状态

        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)  # 默认全屏

        codec = cv2.VideoWriter_fourcc(*"mp4v")

        self.video_out = cv2.VideoWriter(self.video_filename, codec, frame_rate, (self.recording_area[2], self.recording_area[3]))

        # 判断是否需要录制麦克风

        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():  # 检查事件状态

            img = pyautogui.screenshot(region=self.recording_area)  # 录制自定义区域

            frame = np.array(img)

            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

            self.video_out.write(frame)

        self.video_out.release()

        print("视频录制结束")

    def record_audio(self, filename):

        chunk = 1024

        sample_format = pyaudio.paInt16

        channels = 2

        fs = 44100  # 采样频率

        p = pyaudio.PyAudio()

        # 打开麦克风输入流

        stream = p.open(format=sample_format,

                        channels=channels,

                        rate=fs,

                        input=True,

                        frames_per_buffer=chunk)

        frames = []

        while not self.stop_event.is_set():  # 检查事件状态

            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("录音结束")

    def stop_recording(self):

        self.recording = False

        self.stop_event.set()  # 设定事件,结束录制

        if self.record_microphone:

            self.audio_thread.join()  # 等待音频线程结束

        if os.path.isfile('merged_video.mp4'):

            messagebox.showinfo("提示", "合并视频文件已保存至当前目录文件夹,想重新录制请删除原文件后重试!")

            # 更新按钮状态

            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)

        # 更新按钮状态

        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()




总结

在处理复杂的音频录制相关代码时,我曾被音频编码、采样率设置等问题困扰许久。但借助 CodeBuddy 的代码补全功能,它能依据代码上下文,精准预测我需要输入的代码内容,大大减少了代码编写过程中的错误与重复劳动。比如在编写 Python 语言的音频录制模块时,当我输入 “import pyaudio” 并开始编写录制音频的函数时,CodeBuddy 能自动补全函数参数、变量定义等关键代码部分,让编码工作变得顺畅许多。​

CodeBuddy 的代码审查功能也为我开发录屏录音工具保驾护航。在完成部分代码编写后,利用其代码审查模式,它能够自动检查代码中潜在的语法错误、逻辑缺陷以及代码规范问题。像我在编写录制文件存储路径相关代码时,CodeBuddy 及时发现了我对文件路径处理不当可能导致的文件存储失败问题,并给出了详细的优化建议,帮助我提升了代码质量,确保整个录屏录音工具的稳定性和可靠性。​

如果你也感兴趣的话,不妨去试试呢

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。