5

鉴于我有一个 .wav 文件,在 C# 中读取其比特率属性的最佳方法是什么。我尝试过 Shell,并问了一个问题“比特率”属性是否固定在索引 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 音频文件,你会使用什么库/方法来获取比特率?

4

2 回答 2

5

您可以轻松读取文件中偏移量 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/

于 2014-02-05T05:25:47.900 回答
5

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

using (var reader = new WaveFileReader(filename))
{
    bitrate = reader.WaveFormat.AverageBytesPerSecond * 8;
}

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

于 2014-02-05T07:31:07.623 回答