NAudio的錄音和播放錄音都有對應(yīng)的類,我在使用Wav格式進(jìn)行錄音和播放錄音時使用的類時WaveIn和WaveOut,這兩個類是對功能的回調(diào)和一些事件觸發(fā)。
在WaveIn和WaveOut之外還有對音頻流讀寫使用的WaveFileWriter和WaveFileReader類,具體細(xì)節(jié)可查看其源碼進(jìn)行分析。
其中繪制音頻波形圖根據(jù)錄制和播放需要不同途徑實(shí)現(xiàn)。
1.錄音時實(shí)時顯示波形圖,在錄音時實(shí)時獲取需要使用WaveIn.DataAvailable回調(diào)事件,在這個回調(diào)事件中會傳遞出音頻流數(shù)據(jù),數(shù)據(jù)類型Byte[],這就是音頻內(nèi)容
但這個Byte數(shù)組需要還原為真實(shí)的數(shù)據(jù),它的真實(shí)數(shù)據(jù)類型需根據(jù)PCM寫入時的數(shù)據(jù)格式定,主要有8bit、16bit、24bit、32bit,如寫入時是16bit就需將其轉(zhuǎn)換為16bit數(shù)據(jù)
然后根據(jù)WaveIn.WaveFormat的channels去獲取音頻波形值,然后輸出出來,具體示例如下:
private void waveSource_DataAvailable(object sender, WaveInEventArgs e) { if
(waveFile !=null) { waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();float[] sts = new float[e.Buffer.Length / channels]; int
outIndex =0; for (int n = 0; n < e.Buffer.Length; n += channels) { sts[outIndex
++] = BitConverter.ToInt16(e.Buffer, n) / 32768f; } for (int n = 0; n <
sts.Length; n += channels) { Add(sts[n]); } } }
其中Add()方法就是添加波形值到UI控件上的方法,可根據(jù)自己需求實(shí)現(xiàn)?!?br>
?
2.播放錄音文件時顯示波形圖
播放錄音時需初始化AudioFileReader類,并傳入需要播放的文件路徑,并將這個類傳入WaveOut類中,最后用繼承自ISampleProvider的類加載和初始化調(diào)用Play方法,然后會調(diào)用到WaveOut類Read方法時,會可以使用AudioFileReader.Read()方法進(jìn)行獲取參數(shù),獲取的是float數(shù)組,可直接用于繪制波形圖
private void AnalysisRecord_Click(object sender, RoutedEventArgs e) { var
inputStream =new AudioFileReader(recordList[0]); ISampleProvider aggregator =
new NAudioReader(inputStream); aggregator.MaximumCalculated +=
Aggregator_MaximumCalculated; aggregator.Start();
waveOutDevice.Init(aggregator); waveOutDevice.Volume= 0;
waveOutDevice.PlaybackStopped+= WaveOutDevice_PlaybackStopped;
waveOutDevice.Play(); }
?
public int Read(float[] buffer, int offset, int count)///這個函數(shù)是
ISampleProvider調(diào)用的函數(shù) { var samplesRead = source.Read(buffer, offset, count); for
(int n = 0; n < samplesRead; n += channels) { Add(buffer[n + offset]); } return
samplesRead; }
至于繪制波形的WPF細(xì)節(jié)就在Demo中看吧,主要要注意WaveIn和WaveOut、WaveFileReader和WaveFileWriter相關(guān)內(nèi)容,具體可下源碼和Demo看下
具體可調(diào)試示例如下:示例 <https://download.csdn.net/download/qq_17005083/11644031>
?(也是粗淺學(xué)習(xí),可交流,輕拍磚)
寫的比較亂,可跳轉(zhuǎn)到下一篇 <https://www.cnblogs.com/Khan-Sadas/p/11435536.html>,寫的相對具體點(diǎn)
?
熱門工具 換一換