Как получить продолжительность MP3 в .NET?

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

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

Ответ из более позднего дубликата показывает самый простой способ в 2015 году: stackoverflow.com/a/34518350/1860652

AlexFoxGill 08.11.2016 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
10 261
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

Наконечник для вспышки пригодится в будущем, поскольку мне приходилось иметь дело с этим в прошлом, и я действительно столкнулся с неправильными показаниями продолжительности, которые испортили бы скруббер. Спасибо!

Sander Versluys 20.12.2008 16:30

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

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

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

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

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

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

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

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

Ответ принят как подходящий

После того, как много теоретизирования, я нашел способ правильно и неоспоримо вычислить длительность mp3-файл.

Позвольте мне сначала повторить, почему стандартные методы, описанные выше, не работают:

Метод ID3: не все файлы имеют теги id3, и если они есть, то в них может не быть задано поле продолжительности.

Оценка по чтению одного кадра * размер файла: не сработает для файлов VBR.

Заголовок Xing: он есть не во всех файлах.

Расшифровка и определение по размеру PCM: у меня есть файл размером 3+ ГБ, не буду ждать, пока он декодируется.

Я читаю везде, и все ведет в NAudio. Марк, СПАСИБО за хорошие усилия и чистый исходник! Однако метод, который чаще всего предлагается с NAudio, - это прочитать файл с помощью Mp3FileReader и получить все кадры. Проблема: Mp3FileReader создает оглавление в начале, и это занимает вечность, даже для небольших файлов всего за ОДИН день :)

Марк предложил мне удалить создание оглавления, поскольку исходный код доступен, и при этом я нашел гораздо более простой метод. Вот; это говорит само за себя:

    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;
    }

Кстати, он рассчитал точную продолжительность файла, который составлял 9 дней 18 часов, менее чем за минуту (на самом деле он будет делать это так быстро, как диск может прочитать файл, поскольку он использует ОЧЕНЬ МАЛЕНЬКИЙ ЦП).

Daniel Mošmondor 07.11.2012 16:43

В моем случае это вычислило продолжительность в четыре раза больше фактической продолжительности для всех файлов, с которыми я работал (кстати, все они были стерео-файлами). Возможно, что-то изменилось в NAudio с момента этого ответа, но я не уверен, что * 4.0 необходим, по крайней мере, в случае файлов, с которыми я тестировал. Тем не менее, я ценю ответ, он помог мне на 99% пути.

Jared Phelps 22.03.2013 23:02

@JaredPhelps, у вас было несколько минут экспериментов и одна константа :)

Daniel Mošmondor 27.03.2013 23:12

Я думаю, что @JaredPhelps верен, умножать SampleCount на 2 или 4 не нужно. По крайней мере, для файла, который я тестировал, когда я удалил его, продолжительность оказалась правильной.

Brian 02.04.2013 01:33

@ DanielMošmondor, не могли бы вы пояснить, что вы имеете в виду? Что мне не хватало?

Jared Phelps 06.04.2013 01:20

Есть ли у вас похожая функция для файлов WMA?

Abe Miessler 19.04.2013 03:48

@AbeMiessler, это был бы отличный новый вопрос, не так ли?

Daniel Mošmondor 19.04.2013 10:33

@ DanielMošmondor, да, будет! stackoverflow.com/questions/16107774/…

Abe Miessler 19.04.2013 19:09

привет @ DanielMošmondor, может я знаю тип "_sampleFrequency", который дает мне ошибку.

Satish Singh 29.08.2015 09:10
_sampleFrequency, кажется, тусуется и ничего не делает ...?
Matthew 31.03.2020 05:01

Другие вопросы по теме