惊现编程「降维打击」: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 及时发现了我对文件路径处理不当可能导致的文件存储失败问题,并给出了详细的优化建议,帮助我提升了代码质量,确保整个录屏录音工具的稳定性和可靠性。

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

目录
相关文章
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
389 33
AI Agent
本文介绍了AI Agent的概念及其在云计算3.0时代的焦点地位,强调了其与大语言模型(LLM)的紧密联系。AI Agent由控制端(Brain)、感知端(Perception)和行动端(Action)组成,能够通过LLMs实现复杂的任务分解、记忆管理及工具使用。文章探讨了单代理、多代理及人机交互的应用场景,并分析了钢铁侠中贾维斯的现实版——微软开源JARVIS项目。此外,还提及了国内外多个开源平台及Python在AI领域的核心地位,同时提出了关于智能代理发展的开放问题,如安全性、群体智能演化及代理服务化等。最后提供了丰富的参考资料以供深入研究。
348 16
AI Agent
webpack-dev-server代理后端一直报CORS跨域或500错误
在Vue项目中使用Webpack的devServer代理后端接口时,遇到500错误。问题根源在于浏览器请求中携带的Origin头导致服务器报错,而Postman测试正常。通过分析发现,调整或移除Origin头可解决问题。解决办法包括:1) 在代理配置中添加正确的Origin头;2) 删除请求中的Origin头。文章还深入解析了Origin头的作用及changeOrigin配置的实际意义,并附带相关文档链接,帮助开发者更好地理解与解决类似跨域问题。
150 12
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
67 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
vLLM 核心技术 PagedAttention 原理详解
本文系统梳理了 vLLM 核心技术 PagedAttention 的设计理念与实现机制。文章从 KV Cache 在推理中的关键作用与内存管理挑战切入,介绍了 vLLM 在请求调度、分布式执行及 GPU kernel 优化等方面的核心改进。PagedAttention 通过分页机制与动态映射,有效提升了显存利用率,使 vLLM 在保持低延迟的同时显著提升了吞吐能力。
397 18
vLLM 核心技术 PagedAttention 原理详解
Rocky Linux 10 aarch64 OVF (sysin) - Apple silicon VMware 虚拟机模板
Rocky Linux 10 aarch64 OVF (sysin) - Apple silicon VMware 虚拟机模板
120 34
Rocky Linux 10 aarch64 OVF (sysin) - Apple silicon VMware 虚拟机模板
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS HPE (慧与) 定制版
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS HPE (慧与) 定制版
97 9
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS HPE (慧与) 定制版
Kubernetes 驱动的 IaC,Crossplane 快速入门
Crossplane 是一个开源的 Kubernetes 扩展工具,允许用户通过声明式配置直接在 Kubernetes 中管理云资源。对于阿里云开发者,借助 Crossplane 和官方提供的 provider-upjet-alibabacloud,可以像管理 Pod 一样轻松操作 ECS 实例、VPC 和 OSS Bucket 等资源。本文介绍了 Crossplane 的核心概念,并通过快速入门指南演示了如何安装 Crossplane、配置阿里云认证并创建第一个 VPC 资源。
244 38
阿里云 OS 控制台:让基础设施运维不再难
涵盖智能异常检测、智能根因分析、智能修复建议的全链路运维解决方案
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问