AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Mp3FileUtils
Thema durchsuchen
Ansicht
Themen-Optionen

Mp3FileUtils

Ein Thema von Gausi · begonnen am 15. Jun 2006 · letzter Beitrag vom 22. Jun 2013
Antwort Antwort
Seite 7 von 9   « Erste     567 89      
Benutzerbild von Gausi
Gausi
Registriert seit: 17. Jul 2005
MP3FileUtils, v0.6


Diese Unit liest aus einer MP3-Datei alle (?) gängigen Informationen aus. Wie bei vielen anderen auch wird der ID3v1-Tag gelesen, fast alle Teile des ID3v2-Tags und diverse Informationen über die Datei ansich, wie z.B. Bitrate und Spieldauer.

Download:
  • Mp3FileUtils - Quellcode inkl. der Demoprogramme. Zip-Archiv, ca. 555kb
  • Demos. - Komplilierte Demo-Programme zum Ausprobieren. Zip-Archiv, ca. 1.9mb
  • Zum Thema Unsynchronisation: "Das Gewitterrätsel - Reloaded" (das war mal eine Aufwärmfrage bei einem Gewinnspiel in der Entwickler-Ecke) (Version 1, Version 2) - Wo war das Gewitter? (Tip: beide Varianten mit dem VLC abspielen und am Scrollbalken spielen )

Änderungen in 0.6:
  • Methoden SetRating und SetPersonalPlayCounter zusammengefasst zu SetRatingAndCounter. Der Code in den eigenen Anwendungen muss da ggf. angepasst werden
  • Unterstützung von "Private Frames"
  • Erkennung des VBRI-Header
  • ein paar neue Genres in der Genre-Liste für ID3v1
  • neue Methoden Get/SetUserText, GetAllUsertextFrames
  • ID3v2Tag.ReadfromStream schneller: Tag wird zuerst komplett geladen, aus dem Memorystream dann die Einzelframes
  • Bugfix: Korrektes Lesen von UTF8-kodierten Textframes mit Delphi 2009
  • Bugfix: ExtendedHeader-Größe wurde falsch interpretiert
  • Bugfix: User-definierte Textframes (TXXX) haben eine andere Struktur als normale Textframes
  • Bugfix: Typ-Gemisch bei GetFrameLength behoben
Folgendes leisten die in dieser Unit implementierten Klassen:
  1. TID3v1Tag:
    • Lesen und Schreiben des ID3v1-Tags
    • Unterscheidung von v1- und v1.1-Tags
  2. TMpegInfo:
    • Lesen/Berechnen der MPEG-Informationen eines mp3-Files - z.B. Bitrate, Channelmode, Samplerate, vbr/cbr, Dauer
    • Schnelles Ermitteln der Daten: Auch bei vbr wird die Spieldauer (fast) immer korrekt ermittelt, ohne die ganze Datei lesen zu müssen
  3. TID3v2Tag:
    • Lesen und Schreiben des ID3v2-Tags
    • Unterstützung aller existierenden Versionen: v2.2, v2.3 und v2.4
    • Unterstützung der Standard-Frames wie Titel, Artist, Album
    • Unterstützung einiger weiterer Text-Frames wie orig. Artist, Composer, Mediatype, Encoder
    • Lesen und schreiben von Lyrics, Bildern, Bewertungen, URLs
    • Lesen und schreiben beliebiger Daten
    • Unterstützung von Unsynchronisation, GroupIDs und Datalength-Bytes
    • Unterstützung von Unicode
    • Unbekannte Frames (~ Informationsfelder) im Tag bleiben erhalten
Für Details verweise ich auf die beiliegende Dokumentation und die verschiedenen Demoprojekte.

Evtl. benötigte Zusatzkomponenten/Units:
Nur für Delphi 2007 oder früher. Verwendung kann in der Datei Config.inc geändert werden.Für Fehlermeldungen oder Codeoptimierungen bin ich jederzeit offen - hier im Thread, per PN oder per Mail.

Edit: Text an die neue Version angepasst.
The angels have the phone box.

Geändert von Gausi (30. Jun 2011 um 19:37 Uhr)
 
MW97

 
Delphi 7 Personal
 
#61
  Alt 16. Aug 2011, 14:20
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 11 Alexandria
 
#62
  Alt 16. Aug 2011, 14:24
Und die Implementation?
Detlef
  Mit Zitat antworten Zitat
MW97

 
Delphi 7 Personal
 
#63
  Alt 16. Aug 2011, 14:24
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)) = '.wmathen
      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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 11 Alexandria
 
#64
  Alt 16. Aug 2011, 14:29
Auf den ersten Blick kann ich keine Ursache entdecken, zumindest solange keine Exceptions auftreten. Du hast aber nur eine Instanz von TAudioInf, oder?
Detlef
  Mit Zitat antworten Zitat
MW97

 
Delphi 7 Personal
 
#65
  Alt 16. Aug 2011, 14:29
In jeder Prozedur, in der ich Titelinformationen auslesen will, deklariere ich eine Instanz von TAudioInf, und gebe sie wieder frei.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 11 Alexandria
 
#66
  Alt 16. Aug 2011, 14:33
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.
Detlef
  Mit Zitat antworten Zitat
ereetzer

 
Delphi XE Starter
 
#67
  Alt 5. Sep 2011, 10:39
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
  Mit Zitat antworten Zitat
Gravitar

 
Delphi 7 Enterprise
 
#68
  Alt 11. Feb 2013, 09:52
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.
  Mit Zitat antworten Zitat
DelTurbo

 
Delphi 2007 Architect
 
#69
  Alt 11. Feb 2013, 10:25
Ich glaube schon das es gehen muss. Da ja auch für jeden Thread ein TId3v2Tag erzeugt wird.
  Mit Zitat antworten Zitat
Gravitar

 
Delphi 7 Enterprise
 
#70
  Alt 12. Feb 2013, 18:29
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

Aber, MP3-FileUtils ist auf jeden Fall threadsicher, wie über 700 parallele Threads beweisen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 9   « Erste     567 89      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz