2015-05-30 73 views
3

我想使用naudio計算1秒的任何.wav文件的分貝數。這是我的代碼:使用naudio獲取1秒的音頻文件的分貝數

WaveFileReader reader = new WaveFileReader(@"C:\Users\Admin\Desktop\result.wav"); 
      int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond/1000;    
      //byte[] buffer = new byte[reader.Length]; 
      //int read = reader.Read(buffer, 0, (int)reader.Length); 
      TimeSpan time = new TimeSpan(0, 0, 1); 

      int bytesPerSecond = (int)time.TotalMilliseconds * bytesPerMillisecond; 
      byte[] oneSecondBuffer = new byte[bytesPerSecond]; 
      int read = reader.Read(oneSecondBuffer, 0, bytesPerSecond); 

      short sample16Bit = BitConverter.ToInt16(oneSecondBuffer, 1); 
      double volume = Math.Abs(sample16Bit/32768.0); 
      double decibels = 20 * Math.Log10(volume); 

這條線:

short sample16Bit = BitConverter.ToInt16(oneSecondBuffer, 1); 

返回0。我在做什麼錯?

+1

在你的問題,請澄清有爭議的部分,這是BitConverter.ToInt16(oneSecondBuffer,1)線返回0的標題。計算分貝並不重要,因爲真正的問題發生在之前。最好的問候, –

+1

@Alexander嘗試不同的wavs? BitConverter.ToInt16可以返回0,例如如果字節數組元素是00-00 –

回答

3

我以另一種方式解決了這個任務。這是一段代碼,它可以幫助其他人:

var silenceDict = new Dictionary<int, bool>(); 
      using (NAudio.Wave.AudioFileReader wave = new NAudio.Wave.AudioFileReader(filePath)) 
      { 
       var samplesPerSecond = wave.WaveFormat.SampleRate * wave.WaveFormat.Channels; 
       var readBuffer = new float[samplesPerSecond]; 
       int samplesRead; 
       int i = 1; 
       do 
       { 
        samplesRead = wave.Read(readBuffer, 0, samplesPerSecond); 
        if (samplesRead == 0) break; 
        var max = readBuffer.Take(samplesRead).Max(); 

        if ((int)(max * 100) != 0) 
         silenceDict.Add(i, false); 
        else 
         silenceDict.Add(i, true); 

        i++; 
       } while (samplesRead > 0); 

}