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 2 von 3     12 3      
Benutzerbild von Jelly
Jelly

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 10:32
Das Lesen der Tags hast Du doch schon wunderschön über TFileStream gelöst. Wie die Tags bei anderen Audioformaten aussehen, kann ich Dir nicht sagen, aber für MP3 solltest Du den Code quasi übernehmen können. Einfach in die Read Methode des TMP3File kopieren, und die Properties deiner Klasse füllen:

Delphi-Quellcode:
procedure TMP3Fil.Read ;
begin
    with TFileStream.Create(MusicFileName, fmOpenRead or fmShareDenyNone) do
    try
      Position := Size - 128;
      Read(ID, 3);
      Read(Titel, 30);
      Read(Artist, 30);
      Read(Album, 30);
      Read(Year, 4);
      Read(Comment, 30);
      Read(Genre, 1);
    finally
      Free;
    end;
end ;
So in etwa... Musst natürlich deine Basisklasse noch um die anderen Eigenschaften erweitern, bislang steht ja nur Title drin.
  Mit Zitat antworten Zitat
Nils_13

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 10:34
Zitat:
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...




Der Player soll einen Tageditor besitzen, deshalb ziehe ich Jellys Methode vor.

Ahh..der rote Kasten, danke an alle, ich stürz mich ins coden
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
888 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 10:44
Ich nutze folgende leicht korrigierte Version der ATL-WMA-Unit. Eine Funktion muss um eine Zeile ergänzt werden:
Delphi-Quellcode:
procedure ReadTagExtended(const Source: TStream; var Tag: TagData);
var
  Iterator1, Iterator2, FieldCount, DataSize, DataType: Word;
  FieldName, FieldValue: WideString;
begin
  { Read extended tag data }
  Source.ReadBuffer(FieldCount, SizeOf(FieldCount));
  for Iterator1 := 1 to FieldCount do
  begin
    { Read field name }
    Source.ReadBuffer(DataSize, SizeOf(DataSize));
    FieldName := ReadFieldString(Source, DataSize);
    { Read value data type }
    Source.ReadBuffer(DataType, SizeOf(DataType));
    { Read field value only if string }
    if DataType = 0 then
    begin
      Source.ReadBuffer(DataSize, SizeOf(DataSize));
      FieldValue := ReadFieldString(Source, DataSize);
    end
    else
     begin
      //***************************
      // Added By Daniel Gausi Gaußmann, 16.3.2006
      // Dass diese Zeile wichtig ist, sollte leicht verständlich sein ;-)
      // DataSize hat sonst einen falschen Wert, und es wird falsch gesprungen
      Source.ReadBuffer(DataSize, SizeOf(DataSize));
      //***************************
      Source.Seek(DataSize, soFromCurrent);
    end;
    
    { Set corresponding tag field if supported }
    for Iterator2 := 1 to WMA_FIELD_COUNT do
      if UpperCase(Trim(FieldName)) = WMA_FIELD_NAME[Iterator2] then
        Tag[Iterator2] := FieldValue;
  end;
end;
  Mit Zitat antworten Zitat
Nils_13

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:02
Dann muss aber Mp3File noch ein Create bekommen, damit ich damit arbeiten kann, oder ?
Delphi-Quellcode:
  TAudioFile = class
  private
    //Mp3
    FID: String;
    FTitel: String;
    FArtist: String;
    FAlbum: String;
    FYear: String;
    FComment: String;
    FGenre: Byte;
    FFilename: String;
    FEndung: String;
  public
    constructor Create (AMusicFilename : string) ;
    property ID : string read FID write FID;
    property Titel : string read FTitel write FTitel;
    property Artist : string read FArtist write FArtist;
    property Album : string read FAlbum write FAlbum;
    property Year : string read FYear write FYear;
    property Comment : string read FComment write FComment;
    property Genre : byte read FGenre write FGenre;
    property Filename : string read FFilename write FFilename;
    property Endung : string read FEndung write FEndung;

    function ReadTags(const FileName: String): TAudioFile;
  // procedure Write;
  end;

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

constructor TAudioFile.Create (AMusicFilename: String);
begin
  FFilename := AMusicFilename;
end;

function TAudioFile.ReadTags(const FileName: String): TAudioFile;
begin
  MP3File := TMP3File.
  if LowerCase(ExtractFileExt(Filename)) = '.mp3then

end;

procedure TMP3File.ReadMp3;
begin
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - 128;
    Read(FID, 3);
    Read(FTitel, 30);
    Read(FArtist, 30);
    Read(FAlbum, 30);
    Read(FYear, 4);
    Read(FComment, 30);
    Read(FGenre, 1);
  finally
    Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:12
Zitat von Nils_13:
Dann muss aber Mp3File noch ein Create bekommen, damit ich damit arbeiten kann, oder ?
Nein, der Constructor ist doch schon in TAudioFile definiert.

Und nochwas... Nenn dein Methode nicht ReadMP3. Du implementierst doch gerne eine Methode die die Tags ausliest, und dies nicht auf mp3 beschränkt... Wie willst du denn bei WMA deine Methode nennen... Etwa ReadWMA. Dadurch ist dein ganzes Klassenmodell für die Katz.

Du speicherst später deine Songs z.B. in einer TObjectList... Jetzt willst du für alle Songs die Tags auslesen, unabhängig in welchem Format sie vorliegen, ob mp3 oder wma. Nach deiner Methode müsstest du etwa so vorgehen:

Delphi-Quellcode:
var
  AllSongs : TObjectList ;

procedure ReadAll ;
begin
     for i := 0 to AllSongs.count-1 do begin
        if AllSongs[i] is Tmp3File then (AllSongs[i] as Tmp3File).ReadMp3 ;
        if AllSongs[i] is TvmaFile then (AllSongs[i] as Tmp3File).Readwma ;
     end ;
end ;
Wenn Du morgen ein weiteres Audioformat aufnehmen willst, musst in deinem gesamten Quellcodes (immerhin ja doch 3000 Zeilen angeblich), darauf achten, dass du da neue Format auch korrekt ausliest... Und wehe, du vergisst dies an einer Stelle.

Stattdessen, wenn jede Klasse eine eigene Read Methode deklariert, läuft das alles wesentlich einfacher ab:
Delphi-Quellcode:
var
  AllSongs : TObjectList ;

procedure ReadAll ;
begin
     for i := 0 to AllSongs.count-1 do
        (AllSongs[i] as TAudioFile).Read ;
end ;
und gut ist. Neue Audioformate werden automatisch berücksichtigt.

Lies Dir mal bischen was über Klassenvererbund und Polymorphismus durch. Das sind eigentlich grundlegende Dinge, die du in jeder Delphi Anwendung immer wieder benötigst.
  Mit Zitat antworten Zitat
Nils_13

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:16
Ok, aber wozu brauch ich dann überhaupt noch TMP3File ? Das wird dann doch alles in TAudioFile.Read geregelt.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:18
Nein, geregelt wird das in Tmp3File... Und weil in TAudioFile die Methode Read als abstract definiert ist, ist auch sichergestellt, dass in Tmp3File die Methode auch wirklich definiert werden muss.
  Mit Zitat antworten Zitat
Nils_13

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:21
Ahso, das heißt mit der Schleife geht mir das Programm durch alle Reads durch ?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:23
Abhängig vom Klassentyp, wird die read Methode des Objekts aufgerufen, falls definiert.

Zieh dir mal das Tutorial von Luckie rein, über OOP.
  Mit Zitat antworten Zitat
Nils_13

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

Re: Sehr großes Problem mit den verschiedenen Audiotags

  Alt 21. Aug 2006, 11:30
Ok, hier ist der hoffentlich korrekte Code:
Delphi-Quellcode:
TAudioFile = class
  private
    //Mp3
    FID: String;
    FTitel: String;
    FArtist: String;
    FAlbum: String;
    FYear: String;
    FComment: String;
    FGenre: Byte;
    FFilename: String;
    FEndung: String;
  public
    constructor Create (AMusicFilename : string) ;
    property ID : string read FID write FID;
    property Titel : string read FTitel write FTitel;
    property Artist : string read FArtist write FArtist;
    property Album : string read FAlbum write FAlbum;
    property Year : string read FYear write FYear;
    property Comment : string read FComment write FComment;
    property Genre : byte read FGenre write FGenre;
    property Filename : string read FFilename write FFilename;
    property Endung : string read FEndung write FEndung;

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

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

...

constructor TAudioFile.Create (AMusicFilename: String);
begin
  FFilename := AMusicFilename;
end;

procedure TfrmMain.ReadAll;
var i : Integer;
begin
  for i := 0 to AllSongs.count-1 do
    (AllSongs[i] as TAudioFile).Read;
end;

procedure TMP3File.Read;
begin
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - 128;
    Read(FID, 3);
    Read(FTitel, 30);
    Read(FArtist, 30);
    Read(FAlbum, 30);
    Read(FYear, 4);
    Read(FComment, 30);
    Read(FGenre, 1);
  finally
    Free;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:47 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 by Thomas Breitkreuz