HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

MP3 zene tulajdonságainak lekérdezése programból


Példaprogram letöltése

9096 bájt

A nagy népszerűségnek örvendő MP3 fájlok különböző információkat tartalmaznak az előadóról, az albumról, és még sok minden másról is. Ebben a cikkben egy olyan komponenst mutatunk be, amely a fájl kiválasztása után azonnal beolvassa az abban tárolt adatokat, melyeket akár módosíthatunk is. Nagyon jól használható például egy saját MP3 katalógus program készítésekor.
A mellékelt példaprogram megnyitása előtt a MP3Tag.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Az MP3 fájlokban ezek a kiegészítő adatok a fájl végén találhatók, méghozzá az utolsó 128 bájtban. Mivel nem minden MP3 fájl esetében van ilyen adatblokk a fájl végén, ezért ezt úgy tudhatjuk meg, hogy a 128 bájtos adatblokk első 3 bájtja a "TAG" azonosítót tartalmazza. Ezután következnek a következő adatok: Title, Artist, Comment, és Album adatok, egyenként 30 bájtot lefoglalva, majd a Year 4 bájton, és a Genre 1 bájton. A Genre a zeneszám stílusának kódját tartalmazza. Ha a kód 148-nál nagyobb, akkor a stílus ismeretlen.

Az adatok beolvasását a Refresh eljárás végzi, melyet akár a komponenshez rendelt menüből is meghívhatunk. Definiáltunk egy TMP3TagRecord típust, amely a következőképpen néz ki:
  TID3TagRecord = packed record
    Tag: array[0..2] of Char;
    TagTitle: array[0..29] of Char;
    TagArtist: array[0..29] of Char;
    TagComment: array[0..29] of Char;
    TagAlbum: array[0..29] of Char;
    TagYear: array[0..3] of Char;
    TagGenre: Byte;
  end;
Ha összeadjuk az egyes mezők hosszát, akkor 128-at kapunk, tehát egy ilyen típusú változóba egyből beolvashatjuk az adatokat, ezért a Refresh eljárásban is létrehoztunk egy ilyet TagRec névvel.
procedure TMP3Tag.Refresh;
var
  fs: TFileStream;
  TagRec: TID3TagRecord;
begin
Töröljük a property-k aktuális értékét. A TagUnknown konstans a "<Unknonw>" sztringet tartalmazza. Ha az MP3 fájl nem tartalmaz adatokat, akkor a property-kből ez az érték olvasható csak ki.
  FTagTitle:=TagUnknown;
  FTagArtist:=TagUnknown;
  FTagAlbum:=TagUnknown;
  FTagYear:=TagUnknown;
  FTagStyle:=TagUnknown;
  FTagComment:=TagUnknown;
Ha a fájl nem létezik, akkor már ki is lépünk az eljárásból. Az adatblokk beolvasását a TFileStream osztály használatával végezzük el. Rápozícionálunk az adatblokk elejére, ami a fájl végétől visszafelé számolt 128. bájtnak felel meg, majd beolvassuk ezt a blokkot a TagRec változóba.
  if not FileExists(FFileName) then Exit;
  fs:=TFileStream.Create(FFileName, fmOpenRead);
  try
    fs.Position:=fs.size-128;
    fs.Read(TagRec, SizeOf(TagRec));
  finally
    fs.free;
  end;
Ha ténylegesen egy adatblokkot olvastunk be, akkor a TagRec változó Tag mezőjébe a "TAG" sztring került. Ebben az esetben a property-knek átadjuk a megfelelő értékeket.
  if TagRec.Tag='TAG' then begin
    FTagTitle:=Trim(TagRec.TagTitle);
    FTagArtist:=Trim(TagRec.TagArtist);
    FTagAlbum:=Trim(TagRec.TagAlbum);
    FTagYear:=Trim(TagRec.TagYear);
    FTagGenre:=TagRec.TagGenre;
    FTagComment:=Trim(TagRec.TagComment);
    SetTagGenre(FTagGenre);
 end;
end;
A másik megoldandó feladat a megváltoztatott, vagy új adatok kiírása a fájlba. Ezt végzi el a Save eljárás. Ebben megnyitjuk a fájlt, és beolvassuk az adatblokk első 3 karakterét. Ha a kapott sztring nem "TAG", akkor a fájl végére, egyébként pedig az adatblokk elejére pozícionálunk, majd a TagRec változót feltöltjük a property-k értékeivel és a BlockWrite eljárással kiírjuk a fájlba.
procedure TMP3Tag.Save;
var fh: file of Byte;
      TagRec: TID3TagRecord;
begin
  try
    AssignFile(fh, FFileName); Reset(fh);
    try
      Seek(fh, FileSize(fh) - 128);
      BlockRead(fh, TagRec, SizeOf(TagRec));
      if TagRec.Tag = 'TAG' then  Seek(fh, FileSize(fh) - 128) else Seek(fh, FileSize(fh));
      TagRec.Tag:='TAG';
      StrPCopy(TagRec.TagTitle, FTagTitle);
      StrPCopy(TagRec.TagArtist, FTagArtist);
      StrPCopy(TagRec.TagComment, FTagComment);
      StrPCopy(TagRec.TagAlbum, FTagAlbum);
      StrPCopy(TagRec.TagYear, FTagYear);
      TagRec.TagGenre:=FTagGenre;
      BlockWrite(fh, TagRec, SizeOf(TagRec));
    finally
    end;
  finally
    CloseFile(fh);
  end;
end;

Cikksorozat

#IDKategóriaCikk címeSorozat
1063DelphiInterbase 6 alkalmazása Delphi-ben1. rész
1072DelphiInterbase 6 alkalmazása Delphi-ben2. rész
1084DelphiInterbase 6 alkalmazása Delphi-ben3. rész
1092DelphiTIBTable komponens4. rész
1102DelphiTIBTransaction komponens5. rész
1111DelphiTIBQuery komponens6. rész
1120DelphiTIBStoredProc komponens7. rész
1128DelphiTIBDataSet komponens8. rész
1141DelphiTIBSQL komponens9. rész
1150DelphiTIBSQLMonitor komponens10. rész
1159DelphiTIBUpdateSQL komponens11. rész
1167DelphiIBEvents komponens12. rész
1177DelphiIBDatabaseInfo komponens használata13. rész
1183DelphiTIBConfigService komponens14. rész
1192DelphiTIBSecurityService komponens15. rész
1204DelphiTIBServerProperties komponens16. rész
1213DelphiTIBBackupService komponens17. rész
1222DelphiTIBRestoreService komponens18. rész
1231DelphiTIBValidationService komponens19. rész
1240DelphiTIBStatisticalService komponens20. rész
1249DelphiTIBLogService komponens21. rész
1258DelphiTIBUninstall komponens22. rész
1267DelphiInterBase Express komponenscsomag23. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 333. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |