После того, как много теоретизирования, я нашел способ правильно и неоспоримо вычислить длительность mp3-файл.
Позвольте мне сначала повторить, почему стандартные методы, описанные выше, не будут работать:
Метод ID3: не во всех файлах есть теги id3, и если они есть, они могут не иметь установленного поля продолжительности.
Оценка при считывании одного кадра * Размер файла: не будет работать для файлов VBR.
Заголовок Xing: не у всех файлов есть.
Декодирование и определение его по размеру PCM: у меня есть файл 3+ ГБ, я не собираюсь ждать, пока он декодирует.
Я читаю везде, и все приводит к NAudio. Марк, СПАСИБО за хорошие усилия и чистый источник! Тем не менее, метод, который чаще всего предлагается с NAudio, - это чтение файла с использованием Mp3FileReader и получение всех кадров. Проблема: Mp3FileReader создает TOC в начале, и это занимает вечно, даже для небольших файлов только ОДНОГО дня:)
Марк предложил удалить создание оглавления, так как источник доступен, и при этом я нашел гораздо более простой метод. Вот; это говорит само за себя:
double GetMediaDuration(string MediaFilename)
{
double duration = 0.0;
using (FileStream fs = File.OpenRead(MediaFilename))
{
Mp3Frame frame = Mp3Frame.LoadFromStream(fs);
if (frame != null)
{
_sampleFrequency = (uint)frame.SampleRate;
}
while (frame != null)
{
if (frame.ChannelMode == ChannelMode.Mono)
{
duration += (double)frame.SampleCount * 2.0 / (double)frame.SampleRate;
}
else
{
duration += (double)frame.SampleCount * 4.0 / (double)frame.SampleRate;
}
frame = Mp3Frame.LoadFromStream(fs);
}
}
return duration;
}