2013-09-03 5 views
3

В настоящее время я пытаюсь написать аудиоплеер на C#. Я использую библиотеку BASS для работы с музыкой, но теперь у меня есть небольшая проблема с получением длины песни.Получение длины mp3-файла

Ну я прочитал BASS документ и нашел способ: «Все» мне нужно сделать, это

int stream = Bass.BASS_StreamCreateFile(filepath,....); 
int length = Bass.BASS_ChannelBytes2Seconds(stream, Bass.BASS_ChannelGetLength(stream)); 

И в большинстве случаев я получить действительную длину песни. И здесь проблема начинается. Насколько я знаю, операция создания потока довольно дорога (исправьте меня, если я ошибаюсь), и создание потока только для того, чтобы длина песни выглядела немного глупо.

Итак, мой вопрос: есть ли другой способ получить его, не создавая паровой файл (не так дорого). В дальнейшем я буду думать о чтении тегов id3. Создает ли этот поток «зло, которое должно быть сделано независимо от того, что», и даже если я попытаюсь получить его с другой библиотекой, он будет делать то же самое?

ответ

4

Вы можете использовать Microsoft.WindowsAPICodePack.Shell:

using Microsoft.WindowsAPICodePack.Shell; 

Тогда код так:

string file = "myfile.mp3" 
ShellFile so = ShellFile.FromFilePath(file); 
double 100nanoseconds; 
double.TryParse(so.Properties.System.Media.Duration.Value.ToString(), out 100nanoseconds); 

Существует code project that could help you as well

+0

Ну а это liblary делать что-то другое, то я написал в коде ? – user2184057

+1

Это должно быть намного дешевле. – paqogomez

+1

Маленькая точка, Media.Duration находится в 100nS, а не наносекундах, поэтому ее TimeSpan timeSpan = новый TimeSpan (0,0,0, (int) (наносекунды/10000000)); https://msdn.microsoft.com/en-us/library/windows/desktop/bb787399(v=vs.85).aspx – Vman