<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>



        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)

      ?

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          国产精品 偷拍自拍 | 亚洲AV成人无码网 | 开心五月激情五月综合久久中文字幕 | 国产精品v欧美精品v日韩 | 女人脱了内裤趴开腿让男躁口述 | 国产馆av| 一级免费黄色大片 | 韩国精品一区二区 | 操东北女人视频 | 亚洲AV无码成人精品一区 |