Как читать битрейт WAV-файла в C#

Учитывая, что у меня есть файл.wav, что было бы лучшим способом прочитать его свойство битрейта в C#. Я попробовал Shell и задал вопрос. Является ли свойство "Битрейт" фиксированным в индексе 28? без ответов так. Кроме того, теперь я считаю, что Shell - не лучший способ чтения свойств аудиофайлов. Я исследовал различные библиотеки с открытым исходным кодом, не могу найти много.

TagLib #: Этот работает хорошо, но есть две проблемы. он не отражает фактическую скорость передачи данных в некоторых случаях, когда скорость передачи данных очень низкая (например, менее 30), он просто возвращает 0. Во-вторых, я не уверен, смогу ли я использовать ее для коммерческого использования. В лицензии сказано: http://opensource.org/licenses/LGPL-2.1

NAudio: Просто не предоставляет никаких свойств для чтения битрейта, поэтому я должен рассчитать его. после исследования я получил эту формулу для расчета скорости передачи. битрейт = Samplerate * Каналы * BitsPerSample. В большинстве случаев это работает нормально, но не работает, если вы получили BitsPerSample = 0 для некоторых файлов.wav. Да, файл абсолютно в порядке, я могу его воспроизвести, но BitsPerSample все равно равно 0.

MediaInfo: опять же, нет прямого свойства, нужно пройтись по всем свойствам аудиофайла и затем искать "общую скорость передачи". Более того, в проект нужно добавить две библиотеки DLL, одна из которых -.net wraper, а другая - настоящая DLL.

Извиняюсь за такое длинное резюме, но я не хотел спрашивать "эй, как я могу получить битрейт аудио файла", не показывая то, что я уже сделал. Итак, если у вас есть аудиофайл.wav, какую библиотеку / метод вы бы использовали для получения битрейта?

2 ответа

Решение

С помощью NAudio битрейт вычисляется через AverageBytesPerSecond член WaveFormat состав:

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

Это будет работать для всех несжатых аудиоформатов и наиболее сжатых. Формат файла WAV является контейнерным форматом и может фактически содержать аудио в любом кодеке, хотя его наиболее распространенное использование - PCM. Но не все кодеки имеют CBR (постоянный битрейт). Некоторые имеют переменную скорость передачи данных, поэтому AverageBytesPerSecond собственность может быть оценкой.

Вы можете легко прочитать значение по смещению 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/.

Другие вопросы по тегам