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) { }