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

ahs*_*ant 5 c# audio naudio taglib-sharp mediainfo

鉴于我有一个.wav文件,在C#中读取其比特率属性的最佳方法是什么.我试过Shell,并问了一个问题"比特率"属性是否固定在索引28中?没有asnwers所以.此外,我现在相信Shell不是读取音频文件属性的最佳方式.我研究过不同的开源媒体库,但是找不到多少.

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

NAudio:根本没有暴露任何属性来读取比特率,所以我必须计算它.经过研究,我得到了这个公式来计算比特率.bitrate = Samplerate*Channels*BitsPerSample.这在大多数情况下都可以正常工作,但是如果某些.wav文件的BitsPerSample = 0则会失败.是的文件绝对没问题,我可以播放,但BitsPerSample仍为0.

MediaInfo:再次没有直接属性,必须遍历音频文件的所有属性,然后搜索"整体比特率".而且必须在项目中添加两个dll,一个是.net包装器,另一个是实际的dll.

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

Jim*_*hel 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 该值需要乘以8,因为这是每秒的平均字节数,而不是比特率. (3认同)

Mar*_*ath 5

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

using (var reader = new WaveFileReader(filename))
{
    bitrate = reader.WaveFormat.AverageBytesPerSecond * 8;
}
Run Code Online (Sandbox Code Playgroud)

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