27. september 2002 - 14:18
#3
nåååe ja det gør du ved at læse de tre først bytes og så lave et par tabel opslag.
Her er et lille component der klarer ærterne for dig :
unit MP3Info;
interface
uses
Classes;
type
TMP3Info = class(TComponent)
private
FFileName : String;
FFrequency : Integer;
FBitRate : Integer;
FLayer : Integer;
FMPEGVer : Integer;
procedure SetFileName(const Value: String);
protected
function GetInfo: Boolean;
published
property FileName : String read FFileName write SetFileName;
property Frequency : Integer read FFrequency;
property BitRate : Integer read FBitRate;
property Layer : Integer read FLayer;
property MPEGVer : Integer read FMPEGVer;
end;
procedure Register;
implementation
uses
SysUtils;
const
Bitrate_Array: array[1..2,1..3,1..14] of Integer =
(
(
(32,64,96,128,160,192,224,256,288,320,352,384,416,448),
(32,48,56,64,80,96,112,128,160,192,224,256,320,384),
(32,40,48,56,64,80,96,112,128,160,192,224,256,320)
)
,
(
(32,48,56,64,80,96,112,128,144,160,176,192,224,256),
(8,16,24,32,40,48,56,64,80,96,112,128,144,160),
(8,16,24,32,40,48,56,64,80,96,112,128,144,160)
)
);
Frequency_Array: array[1..2,0..2] of Integer =
(
(44100,48000,32000), (22050,24000,16000)
);
procedure TMP3Info.SetFileName(const Value: String);
begin
FFileName := Value;
if not GetInfo then
raise Exception.Create('Unable to read MP3 Headder info');
end;
function TMP3Info.GetInfo: Boolean;
var
Buffer1, Buffer2, Buffer3 : Byte;
Offset : Integer;
begin
Result := True;
try
with TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite) do
try
Read(Buffer1, 1);
Read(Buffer2, 1);
Read(Buffer3, 1);
finally
free;
end;
{MPEG Version}
if Buffer2 and 16 = 16 then
FMPEGVer := 1
else
FMPEGVer := 2;
{Layer}
if (Buffer2 and 32 = 32) and (Buffer2 and 64 <> 64) then
FLayer := 1;
if (Buffer2 and 32 <> 32) and (Buffer2 and 64 = 64) then
FLayer := 2;
if (Buffer2 and 32 = 32) and (Buffer2 and 64 = 64) then
FLayer := 3;
{Bitrate}
Offset := 0;
if Buffer3 and 16 = 16 then
inc(Offset, 1);
if Buffer3 and 32 = 32 then
inc(Offset, 2);
if Buffer3 and 64 = 64 then
inc(Offset, 4);
if Buffer3 and 128 = 128 then
inc(Offset, 8);
FBitrate := Bitrate_Array[FMPEGVer, FLayer, Offset];
{Sample-Frequency}
Offset := 0;
if Buffer3 and 8 = 8 then
inc(Offset, 1);
if Buffer3 and 4 = 4 then
inc(Offset, 2);
FFrequency := Frequency_Array[FMPEGVer, Offset];
except
Result := False;
end;
end;
procedure Register;
begin
RegisterComponents('Borrisholt', [TMP3Info]);
end;
end.
og så bruger du den sådan her :
uses
MP3Info;
procedure TForm1.Button1Click(Sender: TObject);
begin
With TMP3Info.Create(nil) do
try
FileName := 'D:\MP3\Bell Book and candle\01. Hurry Up.MP3';
Memo1.Clear;
Memo1.Lines.Add('Filename : ' + FileName);
Memo1.Lines.Add('Frequency : ' + IntToStr(Frequency) + 'Khz');
Memo1.Lines.Add('BitRate : ' + IntToStr(BitRate));
Memo1.Lines.Add('Layer : ' + IntToStr(Layer));
Memo1.Lines.Add('MPEGVer : ' + IntToStr(MPEGVer));
finally
free;
end;
end;
Jens B