C# 如何获取具有时间跨度的音频分贝值

标签 c# audio timespan decibel

如何每 1 秒获取一个 wav/mp3 文件的分贝值?使用任何适用于 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

非常感谢您的帮助:)

问候,

最佳答案

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)

关于C# 如何获取具有时间跨度的音频分贝值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6196939/

相关文章:

c# - 如何在不同条件下启用/禁用多个控件中的某些控件?

c# - 我的 UserControl 中的 DependencyProperty 无法更新 ViewModel 中的绑定(bind)属性

php - 具有动态源的 HTML5 音频元素

asp.net-mvc-3 - byte []到ASP.NET MVC网站中的音频

audio - 多个敌人拥有自己的音频源和剪辑,使我的游戏的音频滞后

c# - 使用 DataRowExtension 解析 TimeSpan

c# - 如何将可为 null 的 TimeSpan 转换为具有特定格式的字符串?

c# - WCF设计原则: Is it a good idea to edit auto-generated proxy classes?

c# - 我可以对 GroupTemplate 或 ItemTemplate 进行编号吗?

c# - 更改迄今为止的天数