Как получить правильную длительность аудиофайла mp3 в C# / .NET / DirectX?



Я пишу программу презентации медиа, и я почти закончен, но по какой-то причине я получаю неправильные длительности mp3-файлов. Я использую Microsoft.DirectX.AudioVideoPlayback.Аудиокласс для воспроизведения аудиофайлов, и он хорошо работает для файлов wav. Из поиска google я могу сказать, что это кажется проблемой, когда mp3s кодируются с использованием переменной скорости передачи данных, однако мне нужно, чтобы моя программа точно сообщала независимо от настроек скорости передачи данных на носителе. Вот код:



Media_Audio aud = (Media_Audio)item.MediaFile;
TimeSpan total = aud.EndTime - aud.StartTime;
if (aud.EndTime.TotalSeconds == 0)
{
total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;
}
TimeSpan now = TimeSpan.FromSeconds(aud.Player.CurrentPosition) - aud.StartTime;
string nows = now.Hours.ToString() + ":" + now.Minutes.ToString() + ":" + now.Seconds.ToString();
string tots = total.Hours.ToString() + ":" + total.Minutes.ToString() + ":" + total.Seconds.ToString();
item.currentPosition.Text = nows + "/" + tots;


Ключевая строка:



total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;


Ауд.Плеер-это экземпляр Microsoft.DirectX.AudioVideoPlayback.Звуковой.



Для песни, которая на самом деле длится 5:49 секунд, он сообщает 39:13 в качестве длительности. Такой же длины, как проводник Windows и VLC-плеер. Кроме того, установите пакет K-Lite Mega Codec pack. так что это может быть вмешательство. Мне известен этот вопрос: Как получить длительность MP3 в .NET?
Однако на данном этапе в моей программе у меня нет времени чтобы переключиться с моего текущего способа воспроизведения аудиофайлов на новый, так есть ли у меня другие варианты для определения длительности только с помощью DirectX? Или мне придется прибегнуть к BASS.NET или Таглиб Шарп? (И содержат ли мета-данные точную информацию для VBR-кодированных MP3?)

850   2  

2 ответов:

Я хотел опубликовать его в качестве комментария к @anantoline, но это было слишком долго... Он прав!

Длина файла VBR вообще не может быть оценена. Каждый кадр mp3 внутри него может иметь разный битрейт, поэтому, читая любую часть файла, вы не можете знать, какая плотность данных находится в любой другой части файла. Единственный способ определить точную длину VBR mp3-это декодировать его целиком или (если вы знаете, как) прочитать все заголовки кадров один за другим и собрать их декодированные ПРОДОЛЖИТЕЛЬНОСТЬ.

Вы будете использовать более поздний метод только в том случае, если используемый процессор является ценным ресурсом, который необходимо сохранить. В противном случае, декодируйте весь файл, и у вас будет длительность.

Вы можете использовать мой порт mpg123 для выполнения работы: http://sourceforge.net/projects/mpg123net/

Еще: многие mp3-файлы имеют" материал", добавленный к нему, как теги id3, и если вы не пройдете через весь файл, вы можете ошибочно использовать этот тег в расчете продолжительности.

AFAIK невозможно определить правильную длину MP3-файла, закодированного в VBR, не пробежав весь файл один раз (должен произойти какой-то вид декодирования/воспроизведения, даже если он не представлен).

Вы можете попробовать прочитать тег ID3, чтобы получить длину (написанную там приложением, которое первоначально кодировало трек / декодировало трек один раз. Однако возможно, что предоставленный MP3-файл не имеет тегов ID3 или хуже - неверное значение в теге ID3.

Comments

    Ничего не найдено.