03. januar 2003 - 19:44Der 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.
// 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;
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;
Synes godt om
Ny brugerNybegynder
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.