Как получить длину MP3 в C # - PullRequest
8 голосов
/ 31 июля 2009

Да, это точная копия этого вопроса , но ссылка, данная и принятая в качестве ответа, не работает для меня. Он возвращает неправильные значения (2 минуты mp3 будут перечислены как 1:30, 3 минуты как 2 20) без очевидного паттерна.

Итак, еще раз: как я могу получить длину MP3, используя C #?

или

Что я делаю не так с классом MP3Header :

MP3Header mp3hdr = new MP3Header();
bool boolIsMP3 = mp3hdr.ReadMP3Information("1.mp3");
if(boolIsMP3)
  Response.Write(mp3hdr.intLength);

Ответы [ 7 ]

10 голосов
/ 31 июля 2009

Видимо, этот класс вычисляет продолжительность, используя fileSize / bitRate. Это может работать только для постоянного битрейта, и я предполагаю, что ваш MP3 имеет переменную bitRate ...

РЕДАКТИРОВАТЬ: посмотрите на TagLib Sharp , это может дать вам продолжительность

4 голосов
/ 31 июля 2009

Как вы определили длину MP3, которые являются "неправильными"? Я часто обнаруживал, что информация заголовка может быть неправильной: например, была определенная версия LAME с такой проблемой.

Если вы откроете свойства файла в проводнике Windows, что это отобразит?

3 голосов
/ 24 августа 2010

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

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

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

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

Чтобы точно определить длительность mp3, вы ДОЛЖНЫ прочитать все кадры и рассчитать длительность по их суммированной продолжительности. Есть много случаев, когда люди помещают различные «метаданные» в mp3-файлы, поэтому, если вы оцените битрейт и размер файла, вы догадаетесь неправильно.

0 голосов
/ 09 марта 2013

Есть мое решение для C # с sox библиотекой обработки звука.

public static double GetAudioDuration(string soxPath, string audioPath)
{
    double duration = 0;
    var startInfo = new ProcessStartInfo(soxPath,
        string.Format("\"{0}\" -n stat", audioPath));
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardOutput = true;
    var process = Process.Start(startInfo);
    process.WaitForExit();

    string str;
    using (var outputThread = process.StandardError)
        str = outputThread.ReadToEnd();

    if (string.IsNullOrEmpty(str))
        using (var outputThread = process.StandardOutput)
            str = outputThread.ReadToEnd();

    try
    {
        string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string lengthLine = lines.First(line => line.Contains("Length (seconds)"));
        duration = double.Parse(lengthLine.Split(':')[1]);
    }
    catch (Exception ex)
    {
    }

    return duration;
}
0 голосов
/ 21 июня 2012

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

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

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

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

0 голосов
/ 31 июля 2009

Я хотел бы рассмотреть возможность использования внешнего приложения для этого. Попробуйте Sox и просто запустите версию программы, которая выполняется с помощью soxi (без exe), и попробуйте проанализировать этот вывод. Учитывая ваши варианты, я думаю, что вам лучше просто доверять кому-то еще, кто потратил время на то, чтобы разобраться со всеми странностями в mp3-файлах, если только эта функциональность не является основной для вашей работы. Удачи!

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