如何在 C# 中读取 .wav 文件的比特率

Posted

技术标签:

【中文标题】如何在 C# 中读取 .wav 文件的比特率【英文标题】:How to read Bit rate of .wav file in C# 【发布时间】:2014-03-01 08:00:00 【问题描述】:

鉴于我有一个 .wav 文件,在 C# 中读取其比特率属性的最佳方法是什么。 我试过壳牌,问了一个问题Is "Bit rate" property fixed in index 28?,没有答案。此外,我现在认为 Shell 不是读取音频文件属性的最佳方式。我研究了不同的开源媒体库,找不到太多。

TagLib#:这个工作正常,但有两个问题。在某些比特率非常低(例如小于 30)的情况下,它不能反映实际比特率,它只返回 0。其次,我不确定是否可以将其用于商业用途。许可证上写着http://opensource.org/licenses/LGPL-2.1

NAudio:根本不公开任何属性来读取比特率,所以我必须计算它。经过研究,我得到了这个公式来计算比特率。 比特率 = 采样率 * 通道 * BitsPerSample。这在大多数情况下都可以正常工作,但是如果某些 .wav 文件的 BitsPerSample = 0 则会失败。是的,文件很好,我可以播放,但 BitsPerSample 仍然为 0。

MediaInfo:同样没有直接的属性,必须遍历音频文件的所有属性,然后搜索“整体比特率”。而且项目中还要添加两个dll,一个是.net wraper,另一个是实际的dll。

抱歉这么长的总结,但我不想问“嘿,我怎样才能获得音频文件的比特率”而不显示我已经做过的事情。 那么,如果你有一个 .wav 音频文件,你会使用什么库/方法来获取比特率?

【问题讨论】:

【参考方案1】:

使用 NAudio,比特率是通过 WaveFormat 结构的 AverageBytesPerSecond 成员计算的:

using (var reader = new WaveFileReader(filename))

    bitrate = reader.WaveFormat.AverageBytesPerSecond * 8;

这适用于所有未压缩的音频格式和大多数压缩格式。 WAV 文件格式是一种容器格式,实际上可以在 any 编解码器中包含音频,尽管它最常见的用途是 PCM。但并非所有编解码器都是 CBR(恒定比特率)。有些具有可变比特率,因此AverageBytesPerSecond 属性可能是一个估计值。

【讨论】:

谢谢马克和@Jim,突然间我得到了两个解决方案,都可以工作。只是为来到这个线程寻找比特率的人添加最后一点:我们需要将该比特率除以 1000 以获得 kbps。【参考方案2】:

您可以轻松读取文件中偏移量 28 处的值。

int bitrate;
using (var f = File.OpenRead(filename))

    f.Seek(28, SeekOrigin.Begin);
    byte[] val = new byte[4];
    f.Read(val, 0, 4);
    bitrate = BitConverter.ToInt32(val, 0);

这应该适用于未压缩的 WAV 文件(最常见的类型)。见https://ccrma.stanford.edu/courses/422/projects/WaveFormat/。

【讨论】:

感谢 Jim,这个想法似乎是正确的,但它不起作用。它向我返回“8000”以获取比特率为 64kbps 的有效 .wav 文件。尝试了不同的 .wav 文件,没有运气。 该值需要乘以 8,因为这是每秒平均字节数,而不是比特率。

以上是关于如何在 C# 中读取 .wav 文件的比特率的主要内容,如果未能解决你的问题,请参考以下文章

在 .wav 比特率之间转换时降低音量

蹩脚的mp3改变比特率cpp

如何使用 NAudio 更改 WASAPI 记录比特率?

在 Android 上更改 AudioRecord 的比特率

如何在可可中获取音频文件的比特率

如何在 pydub 中获得相同的输入和输出文件比特率?