Question

given that I have a .wav file, what would be best way to read its Bit rate property in C#. I have tried Shell, and asked a question Is "Bit rate" property fixed in index 28? with no asnwers so for. Also I now believe Shell is not the best way to read audio file properties. I have researched on different open source media libraries, cant find much.

TagLib#: This one works alright but have two issues. it does not reflect actual bit rate in some cases where bit rate is very low (like less than 30), it just returns 0. Secondly, I am not sure if I can use it for commercial use. The License says http://opensource.org/licenses/LGPL-2.1

NAudio: Simply does not expose any property to read the bitrate, so I have to calculate it. after research I got this formula to calculate the bit rate. bitrate = Samplerate * Channels * BitsPerSample. This works fine in most cases, however fails if you got BitsPerSample = 0 for some .wav files. Yes the file is absolutely fine, I can play it, but still BitsPerSample is 0.

MediaInfo: again no straight forward property, have to loop through all the properties of audio file and then search for "overall bit rate". moreover have to add two dlls in project, one is .net wraper and other is actual dll.

Apologies for such a long summary, but I dont wanted to ask "hey how can I get the bit rate of audio file" without showing what I already have done. So, if you have a .wav audio file what library/method would you use to get the bitrate?

Was it helpful?

Solution

With NAudio, the bitrate is calculated via the AverageBytesPerSecond member of the WaveFormat structure:

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

This will work for all uncompressed audio formats and most compressed. The WAV file format is a container format and can actually contain audio in any codec, even though it's most common use is PCM. But not all codecs are CBR (constant bit rate). Some have a variable bit rate, so the AverageBytesPerSecond property may be an estimate.

OTHER TIPS

You can easily read the value at offset 28 in the file.

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);
}

That should work for uncompressed WAV files (the most common type). See https://ccrma.stanford.edu/courses/422/projects/WaveFormat/.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top