2009-06-30 81 views
5

¿Cómo se obtiene la duración (en minutos y segundos) de un archivo de audio MP3/wav en Delphi?Duración de un archivo de audio MP3/wav

+0

¿Qué API está utilizando para reproducir el archivo MP3? TMediaPlayer? –

+0

no, no estoy reproduciendo el archivo, solo necesito la información del archivo. – Attilah

Respuesta

6

Se puede calcular la duración dividiendo el tamaño del archivo de la tasa de bits. Puede obtener la velocidad de bits de uno de los encabezados de cuadros. Por supuesto, esto no funcionará para MP3 de tasa variable, donde puede tener una velocidad diferente para cada fotograma.

Utilizando el Header Layout (que es sólo cuatro bytes):

  1. Abra el MP3 en una corriente

  2. Localizar el inicio de la primera cabecera de la trama mediante la lectura hasta que encontrar la cabecera de sincronización, que tiene 11 bits consecutivos establecidos en 1. Este solía ser 12, pero se modificó para permitir MPEG versión 2.5.

  3. Determine la ID de la versión MPEG. A los efectos de la búsqueda de la velocidad de bits, V2.5 es la misma que V2

  4. Determinar la descripción de la capa

  5. Leer el índice de tasa de bits

  6. Usando la versión MPEG, descripción de la capa y el bit índice de tasa, determinar la tasa de bits real de la tabla de índice de tasa de bits en la referencia de encabezado enlazado

  7. Divida el tamaño del archivo en kilobits ((8 * tamaño en bytes)/1000) por la tasa de bits para obtener la duración segundos

No pude encontrar una muestra Delphi, pero aquí hay un C# implementation que utiliza esta técnica como referencia. Vea el método getLengthInSeconds.

+0

+1, el código para calcular la longitud en segundos es idéntico al que encontré. –

+0

Downvoted: respuesta de solo enlace donde el artículo vinculado ha desaparecido desde que se escribió. – Jules

+0

@Jules: Agradezco un motivo para el voto a la baja, que era válido. Repare el enlace y agregué un resumen de los pasos requeridos y un enlace a la referencia del encabezado. –

-1

Ha pasado mucho tiempo desde que jugué con Dephi.

intento,

FileSize(var aFile) 
+0

Eso dará el tamaño en bytes, no en minutos y segundos. –

+1

@ Charlie Sales - Esto fue publicado antes de que OP explicara que querían minutos/segundos. Le daría un descanso a Secko. Además, FileSize() podría ser útil y usarse en la fórmula que Bruce y yo publicamos. –

+0

La pregunta era "¿Cómo se obtiene la longitud de un archivo de audio MP3/WAV en Delphi?". – Secko

3

Mp3 are divided into frames like this

Tendrá que contar el número de fotogramas

+0

+1 para obtener información sobre marcos. –

+0

no es tan simple como decirlo. El archivo mp3 tiene mucha información antes de que comiencen los marcos ... –

2

No estoy seguro de que esto funcione, pero encontré este forum post. Compararía resultados con algo así como winamp para asegurarme de que funciona.

+1

Preciso para CBR (velocidad de bits constante), probablemente inexacto para VBR (velocidad de bits variable). En los casos donde solo se necesita un tiempo aproximado, esta es una buena idea –

+1

¡Aunque este método asume que conoce la velocidad de bits! –

+0

@ Charlies Sales - Es correcto, la fórmula no funcionará en casos de VBR, y la publicación del foro no tiene ninguna indicación de cómo determinar la tasa de bits. La respuesta de Bruce McGee es más completa, y la recomendaría sobre la mía. –

1

Vaya a www.un4seen.com y descargue la biblioteca de bajo, obtendrá mucha información de la sección del foro. ;)

2

En Windows hay una manera bastante efectiva de determinar la longitud de un archivo MP3.

Esto es un truco enorme pero parece funcionar.

Ryan.

//add MPlayer to the uses clause; 
// 
//add the MP3PlayLength function to an existing form and 
//place a button on the form, linking the button click method to see how it works. 

uses MPlayer; 

function TForm1.MP3PlayLength(aMP3FileName:string):string; 
var 
    wMP : TMediaPlayer; 
    wLen : Cardinal; 
begin 
    Try 
    wMP := TMediaPlayer.Create(self); 
    try 
     wMP.Visible := false; 
     wMP.parent := self; 
     wMP.FileName := aMP3FileName; 
     wMP.TimeFormat := tfMilliseconds; 
     wMP.DeviceType := dtAutoSelect; 
     wMP.Open; 
     try 
      wLen := trunc(wMP.Length/1000); 
      result := inttostr(wLen div 60)+':'+inttostr(wLen mod 60); 
     finally 
      wMP.Close; 
     end; 
    finally 
     wMP.free; 
    end; 
    except 
    result := '(err)'; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if OpenDialog1.Execute then 
     showmessage(MP3PlayLength(OpenDialog1.FileName)); 
end; 
2

O bien, pruebe MediaInfo.dll link text.

Se incluye una clase de envoltura Delphi. Por ejemplo:

MediaInfo_Get(Handle, Stream_General, 0, 'Duration', Info_Text, Info_Name) 

otra solución DSPack link text

size := FilterGraph.Duration; 
2

recomiendo que uses BASS

http://www.un4seen.com/bass.html

Bass es una biblioteca de audio .. proporcionar a los desarrolladores de gran alcance funciones de transmisión (MP3 ... OGG ..). Todo en una pequeña DLL, de menos de 100 KB de tamaño.

Es muy fácil de usar

uses BASS; 

    var 
     playingChannel: HSTREAM; 
     playingLength: Double; 
     mp3filename: String; 

    begin 
     BASS_Init(-1,44100,0,Application.Handle,nil); 
     playingChannel:=BASS_StreamCreateFile(FALSE,pchar(mp3filename),0,0,0); 
     playingLength:=BASS_ChannelBytes2Seconds(playingChannel, 
     BASS_ChannelGetLength(playingChannel,BASS_POS_BYTE)); 
    end; 
+0

No es gratis, ¿verdad? – Vassilis

+0

es, para uso no comercial. Consulte "licenciamiento" en www.un4seen.com –

Cuestiones relacionadas