Como recuperar a duração do MP3 no .net?

Eu construí um aplicativo WPF onde os usuários podem arrastar e soltar arquivos MP3 em uma checkbox de listview. Eu preciso de uma maneira de calcular a duração total da playlist.

Quais bibliotecas devo usar? Ou é possível usar apenas o framework .NET?

Depois de muita teorização, encontrei uma maneira de calcular correta e indiscutivelmente a duração de um arquivo mp3.

Deixe-me primeiro reiterar por que os methods padrão acima não funcionarão:

Método ID3: nem todos os arquivos possuem tags id3, e se eles tiverem, eles podem não ter campo de duração definido.

Estimando lendo um quadro * tamanho do arquivo: não vai funcionar para arquivos VBR.

Cabeçalho Xing: nem todos os arquivos possuem.

Decodificando e determinando via tamanho de PCM: Eu tenho 3 + arquivo de GB, eu não vou esperar até que decodifique.

Eu leio em todos os lugares e todas as coisas levam ao NAudio. Mark, obrigado pelo bom esforço e fonte limpa! No entanto, um método que é sugerido principalmente com o NAudio é ler um arquivo usando o Mp3FileReader e obter todos os frameworks. Problema: Mp3FileReader cria um TOC no início e isso leva uma eternidade, mesmo para arquivos pequenos de apenas UM dia 🙂

Mark sugeriu que eu removesse a criação do TOC, pois a fonte está disponível e, ao fazer isso, encontrei um método muito mais simples. Aqui está; é fala por si:

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

Eu envolvi a biblioteca de decodificadores mp3 e disponibilizei para desenvolvedores .net. Você pode encontrá-lo aqui:

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

Estão incluídas as amostras para converter o arquivo mp3 para o PCM e ler as tags ID3.

Eu acho que ele pode ser usado para calcular corretamente a duração do arquivo mp3.

Acabei por escrever o meu próprio para este propósito há alguns anos atrás. Você pode escrever um lado do cliente eficaz usando o flash. Os pontos-chave que eu lembro são:

  1. que você não pode confiar no header do MP3 para ser preciso, então não leia isso para obter a duração
  2. em flash, procure o final do MP3 e, em seguida, leia a posição atual. Isso lhe dará a duração.

Edit: Eu percebo que você queria fazer isso com .net, mas pode realmente ser mais útil para saber o lado do cliente antes de fazer o upload do arquivo para o servidor, como se você quiser impor limites à duração do arquivo, você pode fazer isso muito mais cedo no processo.

[minha própria solução]

Eu adicionei um segundo controle de mediação que eu uso para abrir cada arquivo mp3 na checkbox de listview e obter seu NaturalDuration. Abra e feche cada arquivo na lista e faça uma sum de todos os valores.

Como afirmam outros, os headers de mp3 não são precisos. O mediaelement fornece a duração correta.

Provavelmente não é o método mais rápido, mas no meu caso o mais simples (não depende de outras bibliotecas).