AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Sehr großes Problem mit den verschiedenen Audiotags
Thema durchsuchen
Ansicht
Themen-Optionen

Sehr großes Problem mit den verschiedenen Audiotags

Ein Thema von Nils_13 · begonnen am 19. Aug 2006 · letzter Beitrag vom 21. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

Sehr großes Problem mit den verschiedenen Audiotags

  Alt 19. Aug 2006, 17:17
Hi,

ich füge Lieder zu einer Playlist so zu:
Delphi-Quellcode:
TID3Tag = record
    ID: Array[0..3] of Char;
    Titel: Array[0..30] of Char;
    Artist: Array[0..30] of Char;
    Album: Array[0..30] of Char;
    Year: Array[0..4] of Char;
    Comment: Array[0..30] of Char;
    Genre: Byte;
    Filename: String;
    Endung: String;
  end;

  private
    { Private declarations }
    fFiles : Array of TID3Tag;

// ...

procedure TfrmMain.AddFiles(files : Array of String);
var
  len : integer;
  i : integer;
  s : String;
begin
  len := Length(fFiles);
  SetLength(fFiles, len + Length(files));
  for i := 0 to pred(length(files)) do
  begin
    fFiles[len+i] := ReadID3Tag(files[i]);
  end;
  UpdateListBox();
end;

procedure TfrmMain.UpdateListBox;
var
  i : integer;
begin
  lbList.Items.BeginUpdate;
  lbList.Clear;
  for i := 0 to pred(length(fFiles)) do
  begin
    lbList.Items.Add(trim(fFiles[i].Artist) + ' - ' + trim(fFiles[i].Titel));
  end;
  lbList.Items.EndUpdate;
end;
Das Problem ist, dass ich für jedes Format anders die Tags auslesen muss. Der obige Code liest nur MP3 aus. Ich habe überall im Code querverteilt zugriffe auf fFiles (Mp3-spezifisch), deshalb die Frage: Gibt es eine Möglichkeit TId3Tag so zu erweitern, dass es alle Formate unterstützt und ich nicht alles umschreiben bzw. erweitern muss ?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 19. Aug 2006, 17:25
Ich habe hier mal ein Prinzip vorgestellt, wie man es machen kann.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 19. Aug 2006, 18:27
Werde ich mir merken.

Ich hab es jetzt einfach gelöst: Einfach die ganzen Daten von allen Formaten in den Record packen, die Ladeprozedur erweritern und das war's dann auch schon.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#4

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 20. Aug 2006, 14:23
Die Mp3 Dateien werden zwar korrekt ausgelesen, aber bei WMA-Dateien wird in die Listbox ein Strich hinzugefügt, statt Artist - Titel. AddFiles ruft für die Items ReadID3Tag (ich weiß, der Titel der Prozedur passt nicht mehr) auf und ReadId3Tag entscheidet weiter:
Delphi-Quellcode:
TID3Tag = record
  // MP3
  ID: Array[0..3] of Char;
  Titel: Array[0..30] of Char;
  Artist: Array[0..30] of Char;
  Album: Array[0..30] of Char;
  Year: Array[0..4] of Char;
  Comment: Array[0..30] of Char;
  Genre: Byte;
  Filename: String;
  Endung: String;
  // WMA
  FValid: Boolean;
  FFileSize: Integer;
  FChannelModeID: Byte;
  FSampleRate: Integer;
  FDuration: Double;
  FBitRate: Integer;
  FTitle: WideString;
  FArtist: WideString;
  FAlbum: WideString;
  FTrack: Integer;
  FYear: WideString;
  FGenre: WideString;
  FComment: WideString;
end;


procedure TfrmMain.AddFiles(files : Array of String);
var
  len : integer;
  i : integer;
begin
  len := Length(fFiles);
  SetLength(fFiles, len + Length(files));
  for i := 0 to high(files) do
  begin
    fFiles[len+i] := ReadID3Tag(files[i]);
  end;
end;

procedure TfrmMain.xiAddClick(Sender: TObject);
var
  i : Integer;
begin
  if op1.Execute then
  begin
    setlength(f, op1.files.count);
    for i := 0 to pred(op1.files.count) do
    begin
      f[i] := op1.files[i];
    end;
    AddFiles(f);
  end;
end;

function TfrmMain.ReadID3Tag(const FileName: String): TID3Tag;
begin
  if LowerCase(ExtractFileExt(Filename)) = '.mp3then
  begin
    FillChar(Result, SizeOf(Result), 0);
    with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
    try
      Position := Size - 128;
      Read(Result.ID, 3);
      Read(Result.Titel, 30);
      Read(Result.Artist, 30);
      Read(Result.Album, 30);
      Read(Result.Year, 4);
      Read(Result.Comment, 30);
      Read(Result.Genre, 1);
      Result.Filename := Filename;
      Result.Endung := LowerCase(ExtractFileExt(Filename));
    finally
      Free;
    end;
  end;

  if LowerCase(ExtractFileExt(Filename)) = '.wmathen
  begin
    if WMAfile.ReadFromFile(Filename) then
    if WMAfile.Valid then
    begin
      Result.FTitle := WMAfile.Title;
      Result.FArtist := WMAfile.Artist;
      Result.Filename := Filename;
      Result.Endung := LowerCase(ExtractFileExt(Filename));
    finally
      Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 20. Aug 2006, 20:26
Von welchem Typ ist denn die Variable WMAFile? Was ist das für eine Klasse, und wie liest diese die WMA-Tags aus der Datei aus? Haben die getesteten WMA-Dateien überhaupt Meta-Tags?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 20. Aug 2006, 20:49
Zitat von Nils_13:
Das Problem ist, dass ich für jedes Format anders die Tags auslesen muss. Der obige Code liest nur MP3 aus.
Ja, aber warum arbeitest Du denn überhaupt mit Records.

Ich würd in etwa folgende Klassenhierarchie aufbauen (exemplarisch nur mit der Title Eigenschaft) :

Delphi-Quellcode:
type
  TAudioFile = class
  private
    FTitle : string ;
    FMusicFilename : string ;
  public
    constructor Create (AMusicFilename : string) ;
    property Title : string read FTitle write FTitle ;
    property MusicFilename : string read FMusicFilename write FMusicFilename ;

    procedure Read ; virtual ; abstract ;
    procedure Write ; virtual ; abstract ;
  end ;

  TMP3File = class (TAudioFile)
  public
     procedure Read ;
     procedure Write ;
  end ;

  // TWAVFile = class (TAudioFile) ... analog TMP3File
  

implementation
 
constructor TAudioFile.Create (AMusicFilename : string) ;
begin
     FMusicFilename := AMusicFilename ;
end ;

procedure TMP3Fil.Read ;
begin
     // Hier die Informationen auslesen, und in die geeigneten Properties (Title) ablegen
end ;

procedure TMP3Fil.Write ;
begin
     // Hier die Properties (Title) speichern
end ;
Die ganzen Audiofiles, egal in welchem Format sie vorliegen, würd ich in einer TObjectList speichern. Somit kannst du ganz bequem Audiofiles wie in einem Array verwalten, und musst nur jeweils die Read bzw. Write Methode aufrufen.

Vergiss also die Records und bau auf Objekte auf.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#7

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 09:15
Ok, aber bedeutet das dann nicht gleich wieder eine komplette Programmüberarbeitung ?
Wie würdest du es dann denn auslesen ? Außerdem ist WmaFile eine Unit. Siehe hier.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 09:25
Naja, so gross ist dein Code ja bislang noch nicht. Durch die Überarbeitung gewinnst Du aber deutlich an Flexibilität.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#9

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 09:26
Der Code ist bisher über 2742 Zeilen lang. Aber wie würdest du denn dann die Tags auslesen ?

Bisher mach ich das so:
Delphi-Quellcode:
if fFiles[playindex].Endung = '.mp3then <--
begin
  PlayFile(playindex);
  with fFiles[playindex] do <--
  begin
    s := Artist + ' - ' + Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']';
    lLauftext.Text := s;
    lLauftext.Active := True;
    lLauftext.Transparent := True;
    Application.Title := s;
   end;
   pause := True;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 09:31
Klar bedeutet das teilweise eine komplette Programmänderung, und solche sind immer lästig. Ich kann dir aber aus eigener Erfahrung sagen, dass es sehr sinnvoll ist, das Programm von vorneherein so zu gestalten, dass auch gröbere Änderungen im Funktionsumfang nur geringe Änderungen am Code nötig machen. Also: Besser jetzt alles einmal ändern, und später Ruhe damit haben, als sich ständig damit rumärgern zu müssen.

Ob du nun eine Klassenhierarchie aufbaust, wie Jelly es vorgeschlagen hat, oder nur eine Klasse (mein Vorschlag) mit einer Public-Lese/Schreibroutine, die dann selbst entscheidet, welche Private-Routine (mp3/ogg/wma/...) die richtige ist, bleibt dir überlassen . Wenn es ein reiner Player ohne Tag-Editor werden soll, würde ich meine Methode vorziehen - zur Verarbeitung neuer Dateitypen musst du dann nur die Klasse selbst erweitern, der ganze Rest bleibt gleich.
Möchtest du auch einen umfangreichen Tag-Editor für die unterschiedlichen Typen implementieren, wäre wohl Jellys Methode besser, da mein Verfahren keinen Zugriff auf die internen Tag-Typen (z.B. id2v1 / v2) bietet.

Nachtrag: knappe 3000 Zeilen? Ich durfte mich letztens durch knapp 20.000 Zeilen quälen, weil ich einen Umbau vorgenommen habe. Und das ohne die Hilfe, dass eine vergessene Stelle einen Compilierfehler ergibt...

Edit: Mit der ATL-WMA-Unit hatte ich mal ein ganz ähnliches Problem. Die hat iirc einen kleinen Fehler, bzw. versteht die neue WMA-Version nicht richtig. Ich hab den glaube ich ausgebügelt, werde mal danach suchen, und dann hier posten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:36 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