C#如何获得具有时间跨度的Audio Decibel值

时间:2011-06-01 06:04:00

标签: c# audio timespan decibel

我如何获得每1秒获得一次wav / mp3文件的Decibel值?使用任何适用于C#的音频库..

类似的东西:

Time: 0, DB: 0.213623
Time: 1, DB: 0.2692261
Time: 2, DB: 0.2355957
Time: 3, DB: 0.2363281
Time: 4, DB: 0.3799744
Time: 5, DB: 0.3580322
Time: 6, DB: 0.1331177
Time: 7, DB: 0.3091431
Time: 8, DB: 0.2984009

我真的很感谢你的帮助:)。

的问候,

2 个答案:

答案 0 :(得分:13)

使用NAudio,您可以使用WaveFileReaderMp3FileReader类来访问文件中的示例数据作为字节数组。然后,您需要读取文件并获取样本值(例如,对于16位音频,每两个字节代表一个短)。如果文件是立体声,它将交替左样本,右样本。

然后你需要提出一种测量分贝的策略。您是要在每秒钟中寻找最响亮的样本,还是每秒钟的平均样本量,或者只选择那一秒播放的样本?获得该值后,需要对其进行归一化,使1最大(因此对于16位音频,将值除以32768)。另外,使用样本的绝对值。现在可以计算出以分贝为单位的值:

short sample16Bit = BitConverter.ToShort(buffer,index);
double volume = Math.Abs(sample16Bit / 32768.0);
double decibels = 20 * Math.Log10(volume);

在NAudio演示应用程序中,“SampleAggregator”用于收集给定时间段内的最小和最大样本值,然后用于绘制音频波形和更新音量表。您可以使用同一个类为您提供传递到分贝转换函数的值。

(有关分贝的详细说明,请参阅this page

答案 1 :(得分:1)

我从NAudio Library中给出的示例中找到了一个解决方案。 因为我找到的解决方案是如此之大。我不打算在这里发布。 所以如果有人想要做同样的事情,我会给出提示。 NAudioDemo应用程序 - > AudioPlayBackDemo文件夹 - > AudioPlayBackPanel.cs文件......