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.pswp.cn/bicheng/75715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75715.shtml
英文地址,請注明出處:http://en.pswp.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;而專注密度決定成長速度。 作為機器視覺工…