form+ffmpeg+opus录音压缩音频

说明:
form+ffmpeg+opus录音压缩音频
效果图:
在这里插入图片描述

step1:opus格式录音
C:\Users\wangrusheng\RiderProjects\WinFormsApp11\WinFormsApp11\Form1.cs

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;namespace WinFormsApp11
{public partial class Form1 : Form{// FFmpeg配置private readonly string ffmpegPath = @"C:\Users\wangrusheng\AppData\Local\Microsoft\WinGet\Links\ffmpeg.exe";/**输入cmd指令,获取麦克风地址,动态获取,把你的麦克风地址 替换成下面的地址C:\Users\wangrusheng>ffmpeg -list_devices true -f dshow -i dummy[dshow @ 00000205b9227200] "阵列麦克风 (AMD Audio Device)" (audio)[dshow @ 00000205b9227200]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2D7B50BB-AD6C-4823-8F7F-5552B9D873B9}"*/private const string AudioDevice = @"audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2D7B50BB-AD6C-4823-8F7F-5552B9D873B9}";private const string OutputFile = "recording.opus";private Process ffmpegProcess;private Label statusLabel;private Button btnStart;private Button btnStop;public Form1(){InitializeComponent();InitializeUI();CheckPrerequisites();}private void InitializeUI(){// 窗体设置this.Text = "音频录音机";this.Size = new System.Drawing.Size(300, 200);// 状态标签statusLabel = new Label{Text = "准备就绪",Location = new System.Drawing.Point(20, 20),AutoSize = true};this.Controls.Add(statusLabel);// 开始按钮btnStart = new Button{Text = "开始录音",Location = new System.Drawing.Point(20, 60),Size = new System.Drawing.Size(100, 40)};btnStart.Click += BtnStart_Click;this.Controls.Add(btnStart);// 停止按钮btnStop = new Button{Text = "停止录音",Location = new System.Drawing.Point(140, 60),Size = new System.Drawing.Size(100, 40),Enabled = false};btnStop.Click += BtnStop_Click;this.Controls.Add(btnStop);// 文件路径显示var pathLabel = new Label{Text = $"保存路径:{Path.Combine(Application.StartupPath, OutputFile)}",Location = new System.Drawing.Point(20, 120),AutoSize = true};this.Controls.Add(pathLabel);}private void CheckPrerequisites(){// 检查FFmpeg是否存在if (!File.Exists(ffmpegPath)){MessageBox.Show($"FFmpeg未找到:{ffmpegPath}");btnStart.Enabled = false;}}private void BtnStart_Click(object sender, EventArgs e){if (ffmpegProcess != null && !ffmpegProcess.HasExited){MessageBox.Show("请先停止当前录音");return;}try{var startInfo = new ProcessStartInfo{FileName = ffmpegPath,// 修改2: 添加opus编码参数Arguments = $"-f dshow -i \"{AudioDevice}\" -c:a libopus -b:a 64k -y \"{OutputFile}\"",UseShellExecute = false,CreateNoWindow = true,RedirectStandardInput = true,RedirectStandardError = true};ffmpegProcess = new Process { StartInfo = startInfo };ffmpegProcess.ErrorDataReceived += (s, args) => Debug.WriteLine($"[FFmpeg] {args.Data}");ffmpegProcess.Start();ffmpegProcess.BeginErrorReadLine();btnStart.Enabled = false;btnStop.Enabled = true;statusLabel.Text = "录音进行中...";}catch (Exception ex){MessageBox.Show($"启动失败:{ex.Message}");ResetControls();}}private void BtnStop_Click(object sender, EventArgs e){if (ffmpegProcess == null || ffmpegProcess.HasExited) return;try{ffmpegProcess.StandardInput.WriteLine("q");if (!ffmpegProcess.WaitForExit(1500)){ffmpegProcess.Kill();}statusLabel.Text = $"录音已保存到:{OutputFile}";}catch (Exception ex){MessageBox.Show($"停止失败:{ex.Message}");}finally{ResetControls();ffmpegProcess?.Dispose();ffmpegProcess = null;}}private void ResetControls(){btnStart.Enabled = true;btnStop.Enabled = false;}protected override void OnFormClosing(FormClosingEventArgs e){if (ffmpegProcess != null && !ffmpegProcess.HasExited){ffmpegProcess.Kill();ffmpegProcess.Dispose();}base.OnFormClosing(e);}}
}

step2:wav格式录音

 至少普通录音可以了using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;namespace WinFormsApp11
{public partial class Form1 : Form{// FFmpeg配置private readonly string ffmpegPath = @"C:\Users\wangrusheng\AppData\Local\Microsoft\WinGet\Links\ffmpeg.exe";/**输入cmd指令,获取麦克风地址,动态获取,把你的麦克风地址 替换成下面的地址C:\Users\wangrusheng>ffmpeg -list_devices true -f dshow -i dummy[dshow @ 00000205b9227200] "阵列麦克风 (AMD Audio Device)" (audio)[dshow @ 00000205b9227200]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2D7B50BB-AD6C-4823-8F7F-5552B9D873B9}"*/private const string AudioDevice = @"audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2D7B50BB-AD6C-4823-8F7F-5552B9D873B9}";private const string OutputFile = "recording.wav";private Process ffmpegProcess;private Label statusLabel;private Button btnStart;private Button btnStop;public Form1(){InitializeComponent();InitializeUI();CheckPrerequisites();}private void InitializeUI(){// 窗体设置this.Text = "音频录音机";this.Size = new System.Drawing.Size(300, 200);// 状态标签statusLabel = new Label{Text = "准备就绪",Location = new System.Drawing.Point(20, 20),AutoSize = true};this.Controls.Add(statusLabel);// 开始按钮btnStart = new Button{Text = "开始录音",Location = new System.Drawing.Point(20, 60),Size = new System.Drawing.Size(100, 40)};btnStart.Click += BtnStart_Click;this.Controls.Add(btnStart);// 停止按钮btnStop = new Button{Text = "停止录音",Location = new System.Drawing.Point(140, 60),Size = new System.Drawing.Size(100, 40),Enabled = false};btnStop.Click += BtnStop_Click;this.Controls.Add(btnStop);// 文件路径显示var pathLabel = new Label{Text = $"保存路径:{Path.Combine(Application.StartupPath, OutputFile)}",Location = new System.Drawing.Point(20, 120),AutoSize = true};this.Controls.Add(pathLabel);}private void CheckPrerequisites(){// 检查FFmpeg是否存在if (!File.Exists(ffmpegPath)){MessageBox.Show($"FFmpeg未找到:{ffmpegPath}");btnStart.Enabled = false;}}private void BtnStart_Click(object sender, EventArgs e){if (ffmpegProcess != null && !ffmpegProcess.HasExited){MessageBox.Show("请先停止当前录音");return;}try{var startInfo = new ProcessStartInfo{FileName = ffmpegPath,Arguments = $"-f dshow -i \"{AudioDevice}\" -y \"{OutputFile}\"",UseShellExecute = false,CreateNoWindow = true,RedirectStandardInput = true,RedirectStandardError = true};ffmpegProcess = new Process { StartInfo = startInfo };ffmpegProcess.ErrorDataReceived += (s, args) => Debug.WriteLine($"[FFmpeg] {args.Data}");ffmpegProcess.Start();ffmpegProcess.BeginErrorReadLine();btnStart.Enabled = false;btnStop.Enabled = true;statusLabel.Text = "录音进行中...";}catch (Exception ex){MessageBox.Show($"启动失败:{ex.Message}");ResetControls();}}private void BtnStop_Click(object sender, EventArgs e){if (ffmpegProcess == null || ffmpegProcess.HasExited) return;try{ffmpegProcess.StandardInput.WriteLine("q");if (!ffmpegProcess.WaitForExit(1500)){ffmpegProcess.Kill();}statusLabel.Text = $"录音已保存到:{OutputFile}";}catch (Exception ex){MessageBox.Show($"停止失败:{ex.Message}");}finally{ResetControls();ffmpegProcess?.Dispose();ffmpegProcess = null;}}private void ResetControls(){btnStart.Enabled = true;btnStop.Enabled = false;}protected override void OnFormClosing(FormClosingEventArgs e){if (ffmpegProcess != null && !ffmpegProcess.HasExited){ffmpegProcess.Kill();ffmpegProcess.Dispose();}base.OnFormClosing(e);}}
}

steo3: 输出文件
同样是11秒的录音文件,保存后的大小,相差20倍

recording.opus 98kb
recording.wav 1895kb
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程面试题(三十)

将ISO8859-1字符串转成GB2312编码,语句为? String snew String(text.getBytes(“iso8859-1”),”gb2312”). 说出你用过的J2EE标准的WEB框架和他们之间的比较? 答:用过的J2EE标准主要有:JSP&Servlet、JDBC、JNDI…

每日一题(小白)分析娱乐篇10

由题知计算阶乘之和,我们可以用for循环计算每一次的值把总和放在BigInteger然后进行判断。但是这样明显过于麻烦,我们可以利用数学的本质去思考这个问题,以0结尾的数字乘以一个数字必定为0,阶乘之中必定有2和5结尾的数字相乘得0&a…

【51单片机】2-3【I/O口】震动传感器控制LED灯

1.硬件 51最小系统LED灯模块震动传感器模块 2.软件 #include "reg52.h"sbit led1 P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口 sbit vibrate P3^3;//震动传感器DO接P3.3口void Delay2000ms() //11.0592MHz {…

Linux网络状态监控利器:netstat与ping命令详解

网络状态监控利器:netstat与ping命令详解 在Linux系统的网络管理中,实时监控网络状态是确保系统稳定运行的关键环节。netstat和ping作为两个常用的网络监控工具,分别提供了详细的网络状态信息和网络连通性检测功能。本文将全面解析这两个命令…

【spring cloud Netflix】Eureka注册中心

1.概念 Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的 需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。同时,服务提供方与Eureka之间通过“心跳” 机制进行监控&#xf…

Linux中C++ gdb调试命令

编译可执行文件需要带上-g选项参数 输入回车则重复执行上一次命令; 进入gdb: gdb 程序名运行gdb命令: r打断点命令: b 行号查看断点命令: i b打印变量命令: p 变量名持续查看变量命令: d…

【进收藏夹吃灰】机器学习学习指南

博客标题URL【机器学习】线性回归(506字)https://blog.csdn.net/from__2025_03_16/article/details/146303423

【通信观察家】2025年Q1通信业技术跃迁与生态重构:AI+低空经济双轮驱动

一、行业动态与投资热点 1. 算力投资加速 1) 腾讯2024年财报显示,AI相关资本开支同比增长221.27%,2025年计划继续加码AI原生应用研发及算力基础设施建设,其自研混元T1模型(Hybrid-Mamba-Transformer架构)已上线并开放云服务。 2) 中国移动和…

基于 Vue + Django + MySQL 实现个人博客/CMS系统

目录 1. 环境搭建与项目初始化 后端 (Django) 2. 数据库模型设计 用户认证模型 (Django Auth) 文章模型 (models.py) 全文索引优化 3. 后端API开发 (Django REST Framework) 用户注册/登录 文章发布与搜索 4. 前端实现 (Vue 3) 项目初始化 核心功能实现 5. 访问统…

从全球首发到独家量产,远峰科技持续领跑数字钥匙赛道

数字车钥匙「新纪元」即将开启,星闪数字钥匙正式进入量产周期。 随着汽车智能化快速普及,数字钥匙的搭载量正在快速提升。根据高工智能汽车研究院的数据,2024年中国市场乘用车前装标配搭载数字钥匙的新车交付量超过1000万辆,同比…

C#高级:利用LINQ进行实体列表的集合运算

问题引入: Teacher实体的唯一标识符是Name和Classes字段(或者说这两个字段唯一确定一条数据),如何对两个实体列表做交集、差集运算呢?(并集直接调用AddRange方法即可) 一、重写方法实现 1.原…

C++\MFC锁lock从专家到小白

C mutex # include <mutex> std::mutex m_lock; void CMainWnd::function() {std::lock_guard<std::mutex> lock(m_lock);... }仅限同一进程内。阻塞等待&#xff1a;当线程 A 持有锁时&#xff0c;线程 B 尝试获取同一互斥锁时&#xff0c;会进入阻塞状态&#x…

COBOL语言的数据库交互

COBOL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中&#xff0c;COBOL&#xff08;Common Business-Oriented Language&#xff09;以其在商业应用中的稳…

黑马点评_知识点

将手机验证码保存到HttpSession中进行验证&#xff08;感觉已经过时&#xff09; Controller中的参数有HttpSession&#xff0c;存验证码session.setAttribute(SystemConstants.VERIFY_CODE, code); 其他的都是逻辑代码 Cookie的缺点 什么是Session集群共享问题&#xff1f; …

CSS语言的硬件驱动

CSS语言的硬件驱动探讨 引言 随着信息技术的迅猛发展&#xff0c;硬件和软件之间的交互愈发复杂&#xff0c;特别是在嵌入式系统、物联网设备等领域&#xff0c;硬件驱动程序的开发变得至关重要。而在众多编程语言中&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为一…

K8s中CPU和Memory的资源管理

资源类型 在 Kubernetes 中&#xff0c;Pod 作为最小的原子调度单位&#xff0c;所有跟调度和资源管理相关的属性都属于 Pod。其中最常用的资源就是 CPU 和 Memory。 CPU 资源 在 Kubernetes 中&#xff0c;一个 CPU 等于 1 个物理 CPU 核或者一个虚拟核&#xff0c;取决于节…

解锁 DeepSeek 与 Matlab:攻克科研难题的技术利刃

技术点目录 第一章、MATLAB 2024b深度学习工具箱新特性简介第二章、卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;第三章、模型可解释性与特征可视化Model Explanation and Feature Visualization第四章、迁移学习算法&#xff08;Transfer Learning…

蓝桥杯_PCF8591

目录 一 前言 二 引言 三 PCF8591介绍 &#xff08;1&#xff09;I2C通信 &#xff08;2&#xff09;原理图中的8591 四 代码层面 &#xff08;1&#xff09;根据题目所给的示范代码&#xff0c;实现ADC 1 为什么需要返回值&#xff0c;同时返回值是unsigned char&#x…

Dify案例-接入飞书云文档实现需求质量评估

dify接入飞书云文档实现需求质量评估 1. 背景与目标2. 系统架构与流程2.1 整体架构图2.2 核心流程2.3 dify工作流概览 3. 实现细节3.1 文档提取3.2 需求评估3.3 参数提取3.4 创建飞书云文档 4. 难点总结4.1 提示词编写4.2 关联飞书云文档4.2.1 安装飞书云文档插件并关联到飞书自…

机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处

在机器视觉行业&#xff0c;真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构&#xff0c;构建可验证的技术能力护城河。记住&#xff1a;你的专业精度决定职业高度&#xff0c;而专注密度决定成长速度。 作为机器视觉工…