怎样在DELPHI中取得MP3文件的TAG信息(title,artist等)。
需要用控件实现吗?若需要,哪儿有?
多谢。

解决方案 »

  1.   


      ScanMP3Folder (Edit1.Text, ListBox1.Items); procedure ScanMP3Folder (const AFolder : string; AMP3List : TStrings); 
    var 
      ds : TDirectoryScanner; 
      a : TAudioInfo; 
      Descr : string; 
      i : integer; 
    begin 
      ds := TDirectoryScanner.Create; 
      a := TAudioInfo.Create; 
      try 
         ds.Recursive := True; 
         ds.RegExprMask := '\.mp[23]'; 
         ds.BuildFileList (AFolder); 
         for i := 0 to ds.Count - 1 do begin 
           a.LoadFromFile (ds.Item [i].Name); 
           if a.ID3.Ok 
            then Descr := a.ID3.Artist + ' - ' + a.ID3.Title 
            else Descr := ExtractFileName (ds.Item [i].Name); 
           Descr := Descr + Format (' (%d sec)', [a.MpegDuration div 1000]); 
           AMP3List.Add (Descr); 
          end; 
        finally begin 
          a.Free; 
          ds.Free; 
         end; 
       end; 
    end; 需要使用两个控件
    http://anso.virtualave.net/delphi_stuff.htm#TAudioInfo(TAudioInfo)
    http://www.delphi3000.com/article.asp?id=1083(TDirectoryScanner)
      

  2.   

    不用控件的:~!
    unit MP_ID3_Unit;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons;type
      TID3Tag = record
        Tag: array[0..2] of Char;
        Songname: array[0..29] of Char;
        Artist: array[0..29] of Char;
        Album: array[0..29] of Char;
        Year: array[0..3] of Char;
        Comment: array[0..29] of Char;
        Genre: Byte;
      end;type
      TID3Info = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Name: TLabel;
        Artist: TLabel;
        Album: TLabel;
        Year: TLabel;
        Comment: TLabel;
        Remove: TBitBtn;
        Update: TBitBtn;
        OK: TBitBtn;
        procedure RemoveClick(Sender: TObject);
        procedure UpdateClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure OKClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function ReadID3Tag(FileName: string): TID3Tag;
        function WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean;
        function RemoveID3Tag(FileName: string): Boolean;
        function ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean;
      end;
    var
      ID3Info: TID3Info;
      id3tag:tid3tag;implementationuses Mp_Unit,MP_List_Unit;{$R *.DFM}procedure TID3Info.RemoveClick(Sender: TObject);
    begin
    if list.SongListView.SelCount>0 then
     if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then
       if removeid3tag(MP3PF.ItemToFileName(list.SongListView.Selected)) then
         begin
           showmessage('Remove ok!');
           edit1.Text:='';
           edit2.Text:='';
           edit3.Text:='';
           edit4.Text:='';
           edit5.Text:='';
         end else ShowMessage('Remove fail!');
    end;function TID3Info.ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean;
    begin
       with ID3Tag1 do
        if (string(ID3Tag2.Tag) <> string(Tag)) or
          (string(ID3Tag2.Songname) <> string(SongName)) or
          (string(ID3Tag2.Artist) <> string(Artist)) or
          (string(ID3Tag2.Album) <> string(Album)) or
          (string(ID3Tag2.Year) <> string(Year)) or
          (string(ID3Tag2.Comment) <> string(Comment)) or
          (ID3Tag2.Genre <> Genre) then Result := False
        else Result := True;
    end;function TID3Info.ReadID3Tag(FileName: string): TID3Tag;
    var
      F: file;
    begin
    {$I-}
      AssignFile(F, FileName);
      Reset(F, 1);
      Seek(F, Filesize(F) - SizeOf(TID3Tag));
      Result.Tag[1] := 'N';
      BlockRead(F, Result, SizeOf(TID3Tag));
      CloseFile(F);
    {$I+}
    end;function TID3Info.RemoveID3Tag(FileName: string): Boolean;
    var
      FileHandle: integer;
      attr:Integer;
    begin
    {$I-}
      attr:=FileGetAttr(FileName);
      FileSetAttr(FileName,faArchive);
      FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareDenyWrite);
      if FileHandle > 0 then
          if ID3Tag.Tag = 'TAG' then
            begin
              FileSeek(FileHandle, 0 - SizeOf(TID3Tag), 2);
              SetEndOfFile(FileHandle);
            end;
       FileClose(FileHandle);
       result := FileHandle <> 0;
       FileSetAttr(FileName,attr);
    {$I+}
    end;function TID3Info.WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean;
    var
      F: file;
      X: Integer;
      attr:Integer;
    begin
    {$I-}
      attr:=FileGetAttr(FileName);
      FileSetAttr(FileName,faArchive);
      AssignFile(F, FileName);
      Reset(F, 1);
      X:=0;
      if ReadID3Tag(FileName).Tag <> 'TAG' then Seek(F, FileSize(F))
      else Seek(F, FileSize(F) - SizeOf(TID3Tag));
      BlockWrite(F, ID3Tag, SizeOf(TID3Tag), X);
      Result := (X <> 0);
      CloseFile(F);
      FileSetAttr(FileName,attr);
    {$I+}
    end;procedure TID3Info.UpdateClick(Sender: TObject);
    var
      S: string;
    begin
     if list.SongListView.SelCount>0 then
      if list.SongListView.Items[list.SongListView.Selected.index].Caption<>'' then
       with ID3Tag do
         begin
           Tag := 'TAG';
           S := edit1.text;
           if length(S) > 30 then setlength(S, 30);
           StrPCopy(Songname, S);
           S := edit2.text;
           if length(S) > 30 then setlength(S, 30);
           StrPCopy(Artist, S);
           S := edit3.text;
           if length(S) > 30 then setlength(S, 30);
           StrPCopy(Album, S);
           S := edit4.text;
           if length(S) > 4 then setlength(S, 4);
           StrPCopy(Year, S);
           S := edit5.text;
           if length(S) > 30 then setlength(S, 30);
           StrPCopy(Comment, S);
           if WriteID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected), ID3Tag)
              then  showmessage('Update OK!')
              else  begin
                      showmessage('Update fail!');
                      FormShow(nil);
                    end;  
         end;
    end;procedure TID3Info.FormShow(Sender: TObject);
    begin
      if list.SongListView.SelCount>0 then
      if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then
       ID3Tag:=ReadID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected));
      if (ID3Tag.Tag = 'TAG') and (trim(ID3Tag.songname) <> '')  then
         begin
           //Display the Songname etc.. in the Label
           edit1.Text :=  Trim(ID3Tag.songname);
           edit2.Text :=  Trim(ID3Tag.Artist);
           edit3.Text :=  Trim(ID3Tag.Album);
           edit4.Text :=  Trim(ID3Tag.Year);
           edit5.Text :=  Trim(ID3Tag.Comment);
         end else
               begin
                 edit1.Text :=  ExtractFileName(list.SongListView.Items[list.SongListView.Selected.index].Caption);
                 edit2.Text :=  '';
                 edit3.Text :=  '';
                 edit4.Text :=  '';
                 edit5.Text :=  '';
               end;
    end;procedure TID3Info.OKClick(Sender: TObject);
    begin
      close;
    end;end.