使用 naudio 获取 1 秒音频文件的分贝数

Posted

技术标签:

【中文标题】使用 naudio 获取 1 秒音频文件的分贝数【英文标题】:Get decibels of 1 second of audio file using naudio 【发布时间】:2015-05-30 17:00:41 【问题描述】:

我想使用 naudio 计算任何 .wav 文件的 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。我做错了什么?

【问题讨论】:

在您的问题标题中,请澄清有问题的部分,即 BitConverter.ToInt16(oneSecondBuffer, 1) 返回 0 的行。计算分贝并不重要,因为真正的问题发生在之前。最好的问候, @Alexander 试过不同的 wav 吗? BitConverter.ToInt16 可以返回 0,例如如果字节数组元素是 00-00 【参考方案1】:

我以另一种方式解决了这个任务。这是一段代码,可能对其他人有所帮助:

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);

【讨论】:

以上是关于使用 naudio 获取 1 秒音频文件的分贝数的主要内容,如果未能解决你的问题,请参考以下文章

试图通过javascript从音频文件中获取分贝级别

使用 NAudio 获取音频的峰值

如何使用 NAudio 从 mp3 中获取音频样本数据

NAudio 使用 WaveMixerStream32() 混合 2 两个音频->如何让第二个音频稍后开始

使用 naudio 动态播放音频文件

使用 NAudio 读取包含作品音频的 MemoryStream