Как восстановить длительность MP3 в .NET? - PullRequest
6 голосов
/ 20 декабря 2008

Я создал приложение WPF, где пользователи могут перетаскивать файлы MP3 в список. Мне нужен способ рассчитать общую продолжительность списка воспроизведения.

Какие библиотеки мне следует использовать? Или это возможно, используя только .NET Framework?

Ответы [ 4 ]

15 голосов
/ 07 ноября 2012

После того, как много теоретизирования, я нашел способ правильно и неоспоримо вычислить длительность 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;
    }
2 голосов
/ 24 августа 2010

Я упаковал библиотеку mp3-декодеров и сделал ее доступной для разработчиков .net. Вы можете найти его здесь:

http://sourceforge.net/projects/mpg123net/

Включены примеры для преобразования mp3-файла в PCM и считывания тегов ID3.

Я думаю, что он может быть использован для правильного расчета продолжительности mp3 файла.

1 голос
/ 23 декабря 2008

[моё собственное решение]

Я добавил второй элемент управления медиаэлемента, который я использую, чтобы открыть каждый mp3-файл в списке и получить его NaturalDuration. Откройте и закройте каждый файл в списке и составьте сумму всех значений.

Как утверждают другие, заголовки mp3 не точны. Медиаэлемент обеспечивает правильную продолжительность.

Вероятно, это не самый быстрый метод, но в моем случае самый простой (он не зависит от других библиотек).

1 голос
/ 20 декабря 2008

Я закончил тем, что написал свою собственную для этой цели несколько лет назад. Вы можете написать эффективную на стороне клиента, используя Flash. Ключевые моменты, которые я помню:

  1. , что вы не можете полагаться на заголовок MP3, чтобы быть точным, поэтому не просто читайте это, чтобы получить длительность
  2. во вспышке, найдите конец MP3, а затем прочитайте текущую позицию. Это даст вам продолжительность.

Редактировать: я понимаю, что вы хотели сделать это с .Net, но на самом деле может быть более полезно знать клиентскую сторону перед загрузкой файла на сервер, как если вы хотите наложить ограничения на длину файла, вы можете сделать что намного раньше в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...