Avatar billede anykey Nybegynder
03. januar 2003 - 19:44 Der er 5 kommentarer og
1 løsning

Længde af MP3 i sekunder

Yep.. jeg er klar over, at dette spørgsmål er blevet stillet et par gange før, men føler stadig ikke, at jeg har fundet en besvarelse, som jeg kunne bruge.

Jeg skal bruge en funktion eller et komponent, der kan få længden af en mp3-fil i sekunder præcis som winamp gør det.

Metoden skal fungere hurtigt, da jeg har en masse mp3-filer, der skal køres igennem.

Mvh
AnyKey
Avatar billede jakob_andreasen Nybegynder
03. januar 2003 - 19:56 #1
Mener du når du ligger en masse mp3-filer ind i winamp går der lang tid før den skriver sek og navn på alle sammen
Avatar billede stoney Nybegynder
03. januar 2003 - 20:17 #2
Avatar billede jenshertz Nybegynder
03. januar 2003 - 20:28 #3
Er der da ikke forskel på MP3 og WAV headere ? (DOH! ;))
Avatar billede jenshertz Nybegynder
03. januar 2003 - 20:32 #4
MP3 header: http://sites.inka.de/sites/plagiats-home/mp3-header.html
Derefter divideres fillængden med bitraten ... - skriver lige en funktion som kan det!
Avatar billede jenshertz Nybegynder
03. januar 2003 - 21:17 #5
// Omskriv bits'ne i mp3 headeren til noget brugbart:

function DecToBitrate(dec: Integer): Integer;
begin
  result:=-1;
  case dec of
    1..5: result:=32+(dec-1)*8;
    6..9: result:=80+(dec-6)*16;
    10..13: result:=160+(dec-10)*32;
    14: result:=320;
  end;
end;

// Returnerer længden af en MP3 fil
// Resultat = -1 hvis filen ikke findes

function GetMP3len(str: String): Integer;
var
  stream: TFileStream;
  buf: array[0..10] of Byte;
  bitdec: Integer;
begin
  result:=-1;
  if not FileExists(str) then exit;
  stream:=TFileStream.Create(str,fmOpenRead);
  if stream.Size<4 then begin stream.Free; exit; end;
  stream.Read(buf,4);
  bitdec:=ord(buf[1] and $0F);
  result:=(stream.size-4) div (DecToBitrate(bitdec) div 16*1000);
  stream.Free;
end;
Avatar billede jenshertz Nybegynder
03. januar 2003 - 21:50 #6
Følgende kode kan også finde headeren inde i filen

// Omskriv bits'ne i mp3 headeren til noget brugbart:

function DecToBitrate(dec: Integer): Integer;
begin
  result:=-10000;
  case dec of
    1..5: result:=32+(dec-1)*8;
    6..9: result:=80+(dec-6)*16;
    10..13: result:=160+(dec-10)*32;
    14: result:=320;
  end;
end;

// Returnerer længden af en MP3 fil
// Resultat = -1 hvis filen ikke findes

function GetMP3len(str: String): Integer;
var
  stream: TFileStream;
  buf: array[0..10] of Byte;
  bitdec,a: Integer;
begin
  result:=-1;
  if not FileExists(str) then exit;
  stream:=TFileStream.Create(str,fmOpenRead);
  if stream.Size<4 then begin stream.Free; exit; end;
  while stream.Position<stream.Size do
  begin
    stream.Read(buf,1);
    if buf[0]=$FF then
    begin
      stream.Read(buf,1);
      if (buf[0] and 8)=8 then
        break
      else
        stream.Position:=stream.Position-1;
    end;
  end;
  showmessage(inttostr(stream.position));
  stream.Read(buf,1);
  bitdec:=(buf[0] and $F0) div 16;
  result:=(stream.size-4) div (DecToBitrate(bitdec) div 8*1000);
  stream.Free;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester