C#實(shí)現(xiàn)電腦麥克風(fēng)錄音
本實(shí)例通過Naudio庫完成麥克風(fēng)錄音并把PCM脈沖信號(hào)保存成wav音頻文件。關(guān)于音頻的采樣率、比特率、聲道等問題請(qǐng)查閱相關(guān)資料,本示例不做解釋。Naudio庫 請(qǐng)從NuGet搜索并下載。
錄音接口類:
public interface ISpeechRecorder
{
void SetFileName(string fileName);
void StartRec();
void StopRec();
}
錄音實(shí)現(xiàn)類:
using System;
using NAudio.Wave;
namespace Test
{
class NAudioRecorder : ISpeechRecorder
{
public WaveIn waveSource = null;
public WaveFileWriter waveFile = null;
private string fileName = string.Empty;
/// <summary>
/// 第二步:開始錄音
/// </summary>
public void StartRec()
{
try
{
waveSource = new WaveIn();//保證電腦有麥克接入否則報(bào)錯(cuò)。
waveSource.WaveFormat = new WaveFormat(16000, 16, 1); // 16KHz,16bit,單聲道的錄音格式
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
waveFile = new WaveFileWriter(fileName, waveSource.WaveFormat);
waveSource.StartRecording();
}
catch(Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 第三步:停止錄音
/// </summary>
public void StopRec()
{
waveSource.StopRecording();
// Close Wave(Not needed under synchronous situation)
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
/// <summary>
/// 第一步:設(shè)置錄音結(jié)束后保存的文件路徑
/// </summary>
/// <param name="fileName">保存wav文件的路徑名</param>
public void SetFileName(string fileName)
{
this.fileName = fileName;
}
/// <summary>
/// 開始錄音回調(diào)函數(shù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
/// <summary>
/// 錄音結(jié)束回調(diào)函數(shù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
}
}
調(diào)用方法:
NAudioRecorder nar=new NAudioRecorder(); nar.SetFileName(@"d:\naudio.wav"); nar.StartRec(); nar.StopRec();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)綁定DataGridView與TextBox之間關(guān)聯(lián)的方法,涉及C#綁定控件關(guān)聯(lián)性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
基于WPF實(shí)現(xiàn)ListBox拖動(dòng)子項(xiàng)
這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)ListBox拖動(dòng)子項(xiàng)效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-04-04
深入U(xiǎn)nix時(shí)間戳與C# DateTime時(shí)間類型互換的詳解
本篇文章是對(duì)Unix時(shí)間戳與C# DateTime時(shí)間類型互換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
WPF+ASP.NET SignalR實(shí)現(xiàn)動(dòng)態(tài)折線圖的繪制
這篇文章將以一個(gè)簡(jiǎn)單的動(dòng)態(tài)折線圖示例,簡(jiǎn)述如何通過ASP.NET SignalR實(shí)現(xiàn)后臺(tái)通知功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01
解析c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法
本篇文章是對(duì)c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)
本文主要介紹了C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

