C# Naudio 从麦克风输入到声卡输出 录音 放音功能

1.using NAudio.Wave;从麦克风输入到声卡输出,并操作数据

//创建输出对象

WaveOut waveOut = new WaveOut();

//创建输入对象

WaveIn waveIn = new WaveIn();

//创建缓冲区

BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(16000, 16, 1));

public void PlaySound() {

//输入音频参数设置 16k/16位/通道1

waveIn.WaveFormat = new WaveFormat(16000, 16, 1);

//为wavein的回调函数添加事件,用于操作数据

waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);

//播放

waveOut.Init(bufferedWaveProvider);

waveOut.Play();

}

/// <summary>

/// 回调函数

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void waveIn_DataAvailable(object sender, WaveInEventArgs e)

{

//e.Buffer为用于操作的数组,类型为byte

bufferedWaveProvider.AddSamples(e.Buffer,0,e.BytesRecorded);

byte[] WaveIn_Data = e.Buffer;

}

2.利用Naudio录音,如对wav文件的头不了解请访问wav头文件格式

//新建文件操作对象,System.Windows.Forms.Application.StartupPath为程序bin目录 wave为文件夹名称 格式为wav

WaveFileWriter waveFileWriter = new WaveFileWriter(System.Windows.Forms.Application.StartupPath + "\\wave\\.wav", new WaveFormat(16000, 16, 1));

private void waveIn_DataAvailable(object sender, WaveInEventArgs e)

{

//e.Buffer为用于操作的数组,类型为byte

bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);

byte[] WaveIn_Data = e.Buffer;

waveFileWriter.Write(WaveIn_Data, 0, WaveIn_Data.Length);

}

//先写入头文件,如对wav文件的头不了解请访问

public void CreateWav() {

byte[] bxt = new byte[44] { 82, 73, 70, 70, 36, 124, 7, 0, 87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 1, 0, 64, 31, 0, 0, 128, 62, 0, 0, 2, 0, 16, 0, 100, 97, 116, 97, 0, 124, 7, 0 };

waveFileWriter.Write(bxt, 0, bxt.Length);

}

//停止录音

private void stopMsg_Click(object sender, EventArgs e)

{

waveFileWriter.Close();

}

3.播放文件

//播放

private void PlayWav_Click(object sender, EventArgs e)

{

//文件打开对象

OpenFileDialog dialog = new OpenFileDialog();

//设置格式

dialog.Filter = "Wave File (*.wav)|*.wav;";

//默认路径

dialog.InitialDirectory = System.Windows.Forms.Application.StartupPath + "\\wave\\";

//是否选取文件

if (dialog.ShowDialog() == DialogResult.OK)

{

//文件访问对象

AudioFileReader waveReader = new AudioFileReader(dialog.FileName);

WaveOut waveOutPlay=new WaveOut();

waveOutPlay.Init(waveReader);

// 设置音量 0~1

waveOutPlay.Volume = 1f;

waveOutPlay.Play();

}

}

如需要获取播放状态,可以新建线程或定时器监听状态

if (waveOutPlay.PlaybackState != PlaybackState.Playing) { }