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

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


前言

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

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

基于这些痛点,我萌生了开发一款专属录屏录音工具的想法,期望能打造出一款流畅、权限自由、音画同步且具备强大后期编辑功能的工具。而在开发过程中,选择合适的编程辅助工具至关重要,这便是我将目光投向 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 及时发现了我对文件路径处理不当可能导致的文件存储失败问题,并给出了详细的优化建议,帮助我提升了代码质量,确保整个录屏录音工具的稳定性和可靠性。

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

目录
相关文章
|
数据采集 人工智能 JSON
大模型微调实战指南:从零开始定制你的专属 LLM
企业落地大模型常遇答非所问、风格不符等问题,因通用模型缺乏领域知识。微调(Fine-tuning)可让模型“学会说你的语言”。本文详解微调原理与PEFT技术,结合Hugging Face与LoRA实战,教你用少量数据在消费级GPU打造专属行业模型,提升垂直场景表现。
1986 9
|
7月前
|
人工智能 算法 搜索推荐
Geo专家于磊谈:Geo优化中被忽视的六大核心原则
在AI搜索时代,内容优化正从“流量为王”转向“信任为王”。Geo专家于磊提出“两大核心+四轮驱动”方法论,强调人性化Geo与内容交叉验证,倡导真实、专业、可信的内容建设,助力企业通过AI信任审计,实现高效获客与长期价值。
256 4
Geo专家于磊谈:Geo优化中被忽视的六大核心原则
|
JavaScript 前端开发
React craco 解决 webpack < 5 used to include polyfills for node.js core ...
React craco 解决 webpack < 5 used to include polyfills for node.js core ...
1186 0
|
5月前
|
人工智能 API 网络安全
阿里云轻量应用服务器一键部署 OpenClaw 极简教程
2026年AI Agent爆发,OpenClaw(原Moltbot/Clawdbot)成开发者首选“数字贾维斯”。本教程教你用阿里云轻量应用服务器,3步一键部署全天候AI助理
|
5月前
|
人工智能 自然语言处理 机器人
OpenClaw Skills是什么?2026年阿里云一键部署OpenClaw +Skills多场景应用实战指南
在AI智能体应用日益普及的2026年,OpenClaw(原Clawdbot/Moltbot)凭借其开源灵活的特性成为个人与中小企业打造专属AI助手的优选工具,而核心的**OpenClaw Skills**更是让这款工具的实用性实现了质的飞跃。作为OpenClaw的场景化技能插件库,2026版Skills生态已扩充至50+内置技能,覆盖办公、开发、生活、运营等八大核心场景,且阿里云已完成专属部署流程优化,提供一键部署脚本,集成Skills库自动安装,零基础用户也能快速落地使用。本文将从基础概念、核心能力、阿里云一键部署、全场景实战应用、常见问题解决五个维度,全面解析OpenClaw Skills
1107 2
|
12月前
|
机器学习/深度学习 人工智能 PyTorch
当量子力学遇上人工智能:科幻照进现实了吗?
当量子力学遇上人工智能:科幻照进现实了吗?
463 0
|
10月前
|
传感器 算法 自动驾驶
【卡尔曼滤波跟踪】基于卡尔曼滤波的二维目标跟踪(Matlab实现)
【卡尔曼滤波跟踪】基于卡尔曼滤波的二维目标跟踪(Matlab实现)
413 0
|
11月前
|
SQL 缓存 前端开发
如何开发门店业绩上报管理系统中的统计报表板块?(附架构图+流程图+代码参考)
门店业绩上报管理的核心在于统一数据口径、实现自动化统计,并将数据转化为可落地的运营动作。本文详解了如何构建高效的数据统计报表系统,涵盖总体架构、业务流程、核心功能、开发技巧及三大代码模块(DDL+ETL、后端、前端),助力企业提升运营效率与决策精准度。
|
存储 人工智能 TensorFlow
你的旧电脑还跑得动AI吗?ToDesk云电脑/青椒云/顺网云算力支持实测报告
随着AI大模型的崛起及广泛应用,旧电脑显示出了硬伤,硬件配置方面,老旧的 CPU、GPU 性能不足,运算速度缓慢,导致 AI 模型训练和推理耗时极长。内存与存储有限,无法承载大型 AI 数据集和复杂模型。散热不佳,运行 AI 任务时易过热死机。且旧电脑可能不兼容新的 AI 框架与工具,软件更新困难。这使得用户在利用旧电脑探索 AI 时,体验大打折扣,而 ToDesk云电脑、青椒云、顺网云等或许能为解决这些问题带来新契机。今天就来实测一下常用的ToDesk云电脑/青椒云/顺网云,博主将从功能、优缺点等方面为你深度剖析这几款云电脑,帮你选出最适合的那一款!🏆
1557 5
|
算法 JavaScript 前端开发
JavaScript学习 -- SM4算法应用实例
JavaScript学习 -- SM4算法应用实例
1410 0