Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Mp3FileUtils (https://www.delphipraxis.net/71449-mp3fileutils.html)

MW97 16. Aug 2011 14:20

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;

DeddyH 16. Aug 2011 14:24

AW: Mp3FileUtils
 
Und die Implementation?

MW97 16. Aug 2011 14:24

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;

DeddyH 16. Aug 2011 14:29

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?

MW97 16. Aug 2011 14:29

AW: Mp3FileUtils
 
In jeder Prozedur, in der ich Titelinformationen auslesen will, deklariere ich eine Instanz von TAudioInf, und gebe sie wieder frei.

DeddyH 16. Aug 2011 14:33

AW: Mp3FileUtils
 
Da kann ich Dir nur noch raten, FastMM zu installieren und dann ReportMemoryLeaksOnShutdown zu setzen. Damit bekommst Du zumindest heraus, ob wirklich alles sauber aufgeräumt wird und falls nicht, von welchem Typ die Objektleichen sind.

ereetzer 5. Sep 2011 10:39

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

Gravitar 11. Feb 2013 09:52

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.

DelTurbo 11. Feb 2013 10:25

AW: Mp3FileUtils
 
Ich glaube schon das es gehen muss. Da ja auch für jeden Thread ein TId3v2Tag erzeugt wird.

Gravitar 12. Feb 2013 18:29

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.
Seite 7 von 9   « Erste     567 89      

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