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

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

目录
相关文章
|
7月前
|
开发者
鸿蒙开发:如何实现列表吸顶
鸿蒙当中实现一个列表吸顶,很是简单,官方为我们提供了ListItemGroup组件,使用它,便可以轻松搞定
148 6
鸿蒙开发:如何实现列表吸顶
|
7月前
|
人工智能 前端开发 JavaScript
webpack-dev-server代理后端一直报CORS跨域或500错误
在Vue项目中使用Webpack的devServer代理后端接口时,遇到500错误。问题根源在于浏览器请求中携带的Origin头导致服务器报错,而Postman测试正常。通过分析发现,调整或移除Origin头可解决问题。解决办法包括:1) 在代理配置中添加正确的Origin头;2) 删除请求中的Origin头。文章还深入解析了Origin头的作用及changeOrigin配置的实际意义,并附带相关文档链接,帮助开发者更好地理解与解决类似跨域问题。
516 20
|
7月前
|
人工智能 自然语言处理 安全
CodeBuddy 开发本地 PDF 转图工具
市场上的 PDF 转图片工具存在收费昂贵、功能有限、隐私安全风险等痛点,而使用 CodeBuddy 实现的本地 PDF 批量转图片工具可以有效解决这些问题。CodeBuddy 的强大编程能力让我们可以快速开发出满足需求的工具,而且工具可以在本地运行,保证了文件的隐私安全。此外,工具还支持批量处理和自定义功能,提高了工作效率。如果你也有 PDF 转图片的需求,不妨尝试使用 CodeBuddy 来实现一个属于自己的工具。
256 11
|
7月前
|
存储 人工智能 数据安全/隐私保护
CodeBuddy实现图片水印添加工具
CodeBuddy 的 AI 编程能力 让电商从业者无需成为技术专家,就能快速开发出功能强大、安全可靠的本地水印工具。AI 不仅能自动实现核心功能,还能根据电商场景特点进行优化,大幅缩短开发周期,降低技术门槛,让你专注于业务价值而非技术实现。
218 6
|
7月前
|
存储 人工智能 算法
CodeBuddy实现图片压缩工具
使用 CodeBuddy 实现图片压缩工具,对开发者和用户都有着显著的好处。对于开发者来说,借助 CodeBuddy 高效的开发能力,可以在更短时间内完成工具开发,将更多精力投入到功能优化和用户体验提升上。同时,CodeBuddy 的智能辅助功能有助于开发者学习和掌握新的开发技术和算法,提升自身技术水平。
136 7
|
7月前
|
人工智能
使用CodeBuddy实现网页自动连点器
CodeBuddy 能够迅速理解复杂功能要求,精准生成自动连点器代码。无论是游戏场景里对技能释放点击频率的精确控制,还是办公场景中对特定单元格点击位置的灵活设定,它都能高效满足。
211 6
|
7月前
|
存储 人工智能 搜索推荐
使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
本地视频合并工具在应对存储空间、网络环境、软件安装和隐私安全等痛点上具有显著优势。而 CodeBuddy 凭借其强大的编程能力,为高效开发功能丰富、个性化的本地视频合并工具提供了可靠途径,让视频合并变得更加简单、便捷、安全。 还没有入手的同学赶紧去试试吧
215 6
使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
|
7月前
|
存储 人工智能 前端开发
【CodeBuddy】三分钟开发一个实用小功能之:贪吃蛇经典复刻版
本文通过一个完整的贪吃蛇案例,展示了AI编程助手的强大功能。CodeBuddy不仅实现了绘图、游戏逻辑和碰撞检测等复杂需求,还在100秒内生成300+行可运行代码。它在快速原型开发、代码智能补全、解释优化及异常排查方面表现出色,显著提升开发效率。案例中,AI生成了包含HTML、CSS和JavaScript的完整项目,涵盖游戏循环、状态管理与性能优化。尽管如此,仍存在改进空间,如碰撞检测优化、得分系统扩展和移动端支持。这表明AI并非取代开发者,而是助力其专注于更高层次创新,推动编程方式的革命性变革。
229 7
【CodeBuddy】三分钟开发一个实用小功能之:贪吃蛇经典复刻版
|
7月前
|
存储 人工智能 弹性计算
飞天发布时刻丨阿里云基础设施助力企业全球化业务创新
丰富灵活的算力服务、稳定高可用的存储产品,覆盖了出海企业 AI 创新、 大数据分析、 应用管理和办公协同等不同场景和需求,助力客户业务全球化布局。
|
7月前
|
XML 安全 前端开发
一行代码搞定禁用 web 开发者工具
在如今的互联网时代,网页源码的保护显得尤为重要,特别是前端代码,几乎就是明文展示,很容易造成源码泄露,黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的 Web 开发者工具面板,今天推荐一个不错的 npm 库,可以帮助开发者更好地保护自己的网站源码,本文将介绍该库的功能和使用方法。 功能介绍 npm 库名称:disable-devtool,github 路径:/theajack/disable-devtool。从 f12 按钮,右键单击和浏览器菜单都可以禁用 Web 开发工具。 🚀 一行代码搞定禁用 web 开发者工具 该库有以下特性: • 支持可配
523 22