![]() |
AW: Mp3FileUtils
Delphi-Quellcode:
type
TAudioInf=class private procedure GetMp3Info; procedure GetWmaInfo; procedure SetUnknown; public Interpret: string; Titel : string; Pfad : string; Album : string; Jahr : string; Dauer : integer; //Titelinformationsprozeduren procedure GetAudioInfo(FileName: string); function GetPlaylistTitel: string; end; |
AW: Mp3FileUtils
Und die Implementation?
|
AW: Mp3FileUtils
Delphi-Quellcode:
type
TAudioInf=class private procedure GetMp3Info; procedure GetWmaInfo; procedure SetUnknown; public Interpret: string; Titel : string; Pfad : string; Album : string; Jahr : string; Dauer : integer; //Titelinformationsprozeduren procedure GetAudioInfo(FileName: string); function GetPlaylistTitel:string; end; implementation uses SysUtils, Mp3FileUtils, ATL_WMAfile, Classes; //********************************* //Prozeduren für Titelinformationen //********************************* //Hauptprozedur für Titelinformationen procedure TAudioInf.GetAudioInfo(FileName: string); begin Pfad := filename; if (AnsiLowerCase(ExtractFileExt(FileName)) = '.mp3') then GetMp3Info else if AnsiLowerCase(ExtractFileExt(FileName)) = '.wma' then GetWMAInfo else SetUnknown; if Interpret='' then Interpret:='Unbekannter Interpret'; if Album='' then Album:='Unbekanntes Album'; if Jahr='' then Jahr:='unbekanntes Jahr'; end; //Prozedur für Titelinformationen von MP3-Dateien procedure TAudioInf.GetMp3Info; var MpegInfo: TMpegInfo; ID3v2Tag: TID3V2Tag; ID3v1tag: TID3v1Tag; Stream: TFileStream; begin // Daten mit MP3FileUtils auslesen Mpeginfo:=TMpegInfo.Create; ID3v2Tag:=TID3V2Tag.Create; ID3v1tag:=TID3v1Tag.Create; Stream := TFileStream.Create(Pfad, fmOpenRead or fmShareDenyWrite); try id3v1tag.ReadFromStream(Stream); Stream.Seek(0, sobeginning); Id3v2tag.ReadFromStream(Stream); if Not id3v2Tag.exists then Stream.Seek(0, sobeginning) else Stream.Seek(id3v2tag.size, soFromBeginning); Mpeginfo.LoadFromStream(Stream); Stream.free; //Daten übertragen if mpeginfo.FirstHeaderPosition >- 1 then begin if id3v2tag.artist <> '' then Interpret := id3v2tag.artist else Interpret := id3v1tag.artist; if id3v2tag.Album <> '' then Album :=id3v2tag.Album else Album:=id3v1tag.Album; if id3v2tag.Year<> '' then Jahr:=id3v2tag.Year else Jahr:=id3v1tag.Year; if id3v2tag.title <> '' then Titel := id3v2tag.title else if id3v1tag.title <> '' then Titel := id3v1tag.title else Titel := ExtractFileName(Pfad); Dauer := mpeginfo.dauer; end else SetUnknown; finally MpegInfo.Free; Id3v2Tag.Free; Id3v1Tag.Free; end; end; //Prozedur für Titelinformationen von WMA-Dateien procedure TAudioInf.GetWmaInfo; var wmaFile: TWMAfile; begin if Not FileExists(Pfad) then begin SetUnknown; exit; end; try wmaFile := TWMAFile.create; if wmaFile.ReadFromFile(Pfad) then begin if wmaFile.Title <> '' then Titel := wmaFile.Title else Titel := ExtractFilename(Pfad); Interpret := wmaFile.Artist; Dauer := Round(wmaFile.Duration); Album :=wmaFile.Album; Jahr :=wmaFile.Year; end else SetUnknown; finally wmaFile.Free; end; end; //Prozedur für Titelinformationen von unbekannten Dateien procedure TAudioInf.SetUnknown; begin Titel := ExtractFileName(Pfad); Interpret := ''; Dauer := 0; end; //Prozedur für Titelinformationen nach %Interpret%-%Titel% function TAudioInf.GetPlaylistTitel:string; begin if Trim(Interpret)='' then result := Titel else result := Interpret + ' - ' + Titel; end; |
AW: Mp3FileUtils
Auf den ersten Blick kann ich keine Ursache entdecken, zumindest solange keine Exceptions auftreten. Du hast aber nur eine Instanz von TAudioInf, oder?
|
AW: Mp3FileUtils
In jeder Prozedur, in der ich Titelinformationen auslesen will, deklariere ich eine Instanz von TAudioInf, und gebe sie wieder frei.
|
AW: Mp3FileUtils
Da kann ich Dir nur noch raten,
![]() |
AW: Mp3FileUtils
Hallo Gausi,
ich habe da eine Frage an: angenommen, ich habe mehrere Bewertungen oder Lyrics, Kommentare, etc. Wir kann ich denn festlegen, welcher davon in den meisten Programmen angezeigt wird. So wie ich das sehe, wird der erste gefundene angezeigt? Wie kann ich nun also die Reihenfolge im Tag ändern. So das also z.Bsp. der als 3. gespeicherte Kommentar als 1. gesichert wird? Gruß ereetzer |
AW: Mp3FileUtils
Hi,
kann es sein, dass die Mp3FileUtils nicht threadsicher sind? Habe den merkwürdigen Effekt, dass beim Nutzen von Multithreading, die mp3-Dateien alle mit den gleichen Artist,Titel usw. Informationen überschrieben werden, obwohl ich nur die Lyrics schreibe. Der Effekt tritt unabhängig davon auf, ob ich nun 10 Threads oder 500 Threads laufen habe. |
AW: Mp3FileUtils
Ich glaube schon das es gehen muss. Da ja auch für jeden Thread ein TId3v2Tag erzeugt wird.
|
AW: Mp3FileUtils
Ok, ziehe meine Anmerkung zum Thema "Multithreading" zurück. Ich habe einfach nicht daran gedacht, das IDTag vor dem Schreiben neu einzulesen. In der seriellen Abarbeitung entstand ja auch kein Problem, da ich erst eingelesen haben um zu prüfen, ob bereits lyrics vorhanden waren und danach dann geschrieben habe.
Im der Multithreading-Variante wird aber parallel zu unterschiedlichen Zeitpunkten geschrieben. Ohne direktes Einlesen im Thread wird dann der letzte eingelesene IDTag benutzt (meistens das letzte Lied aus der Liste) und damit alle mp3s mit diesen Informationen überschrieben. Also, mein Fehler :pale: Aber, MP3-FileUtils ist auf jeden Fall threadsicher, wie über 700 parallele Threads beweisen.:thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz