| 
| Autor | Beitrag |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Mi 11.07.07 18:03 
 
	  |  jakobwenzel hat folgendes geschrieben: |  	  | [...] wenn auch nicht unbedingt im JPG-Format (was ja laut Spezifikation das einzige zulässige Format ist) | 
  Das trifft für diese Unit zu, da ich beim Schreiben der Bilder der Einfachheit halber keinen Parameter für den Mime-Typ übergebe, sondern immer '/image/jpeg' schreibe. 
 Beim lesen wird der Bilddaten-Strom in einen Stream kopiert, der dann von einem Programm beliebig interpretiert werden kann. In den Demos gehe ich davon aus, dass es Jpgs sind. Ich könnte die Unit mal so erweitern, dass in dem Typ TPictureframeDescription der Mimetyp mit einfließt, um so ein differenzierteres Verhalten zu ermöglichen.
 Im ID3v2Tag können beliebige Bildtypen gespeichert werden, laut id3.org sollte  man sich aber auf PNG und JPEG beschränken. ("The "image/png" or "image/jpeg" picture format should be used when interoperability is wanted.") Diese Unit beschränkt sich auf Jpeg._________________ We are, we were and will not be.
 |  |  |  
| Chatfix 
          Beiträge: 1583
 Erhaltene Danke: 10
 
 Win 10, Win 8, Win 7, Win Vista, Win XP
 VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
 
 | 
Verfasst: Do 12.07.07 07:43 
 
Hier die Tnt-Kompos, du könntest diese ja mit im ersten Posting reinnehmen... 
Einloggen, um Attachments anzusehen!
 
_________________Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce |  |  |  
| Lazarus 
          Beiträge: 33
 
 
 
 
 | 
Verfasst: Do 12.07.07 19:19 
 
Hallo Gausi,
 ich suche nach einer Möglichkeit auch die Coverbilder anzuzeigen, die möglicherweise nicht JPG sind.
 Es gab zum beispiel mal den Typen 3. Komischerweise werden tlw auch keine Bilder angezeigt, wenn der Typ 0 ist *kratzamkopf*
 Manchmal ja, manchmal nicht. Ich denke aber das liegt noch bei mir (Momentan Testroutinen Quick&Dirty)...
 
 Was bedeuten die Bildtypen ???  0..9 ??
 
 Übrigens, wollte dir mal was mailen, aber dein Postfach hat abgelehnt (Dateigrösse)
 |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Do 12.07.07 20:08 
 
Die Bildtypen sollten eigentlich 0..20 sein. Zumindest das, was in dem Konstrukt TPictureFrameDescription drinsteckt. Dieser Typ hat aber nichts mit dem Format zu tun, sondern ist eine grobe Klassifizierung, um was für ein Bild es sich handelt. Welcher Typ das ist, kann man in dem Konstanten-Array Picture_Types ablesen. Typ 3 wäre dann ein "Cover (front)", 0 "Other". Das ist so im ID3-Standard definiert.
 Die Bilddaten werden ja generell in einen Stream geladen. Und diesen müsste man dann entsprechend als jpg/png/sonstwas interpretieren. Bisher gibt es keine Unterscheidungsmöglichkeit, weil ich den Mimetypen da nicht mit einbeziehe. Man müsste den Code durchgehen und u.a. den Typ TPictureFrameDescription und Routinen wie GetPictureDescription so erweitern, dass auch das Bildformat nach außen geliefert wird. Das werde ich bei Gelegenheit mal in Angriff nehmen.
 
 @Postfach: Per PN gehts nicht, da gibts afaik ne Beschränkung auf 2 MB oder so, aber per E-Mail (gausi@entwickler-ecke.de)sollte das gehen.
 _________________ We are, we were and will not be.
 |  |  |  
| jmh124 Hält's aus hier
 Beiträge: 1
 
 
 
 
 | 
Verfasst: So 12.08.07 22:12 
 
ich hab ein Problem mit der Mp3FileUtils unit.
 Ein bestimmtes Album eines Mp3 Files enthält komische Daten:
 laut winamp steht da der normale Name drin,
 nach dem Id3v1 allerdings etwas in der Art:
 "Albumname'#0'o teilweiseArtistname"
 ich hab jetzt bissi hin und herkonvertiert aber eigentlich keine Ahnung wie ich damit umgehen soll?
 Da ich das auch in eine SQL tabelle werfen möchte sind die quotes dadrin irgendwie problematisch. hier funktioniert auch keine QuoteStr...
 Einer eine Idee ich kann sonst die mp3 datei auch mal zur verfügung stellen    Mfg Julian |  |  |  
| Morkel Hält's aus hier
 Beiträge: 1
 
 WinXP
 BDS2006 Pro
 
 | 
Verfasst: So 16.09.07 11:05 
Titel: Anregungen
 
Hallo Gausi,
 zunächst einmal vielen Dank für die tolle Arbeit!
 
 Ich hätte noch zwei Anregungen:
 - Es wäre sinnvoll, den BPM (beats per minute)-Tag aufzunehmen, da er von vielen Anwendungen
 genutzt wird.
 - Um die Geschwindigkeit beim Verarbeiten geänderter Tags zu erhöhen, erscheint es mir nützlich zu sein,
 statt temporärer Dateien lieber TMemoryStreams zu verwenden.
 
 Viele Grüße
 Fredo
 |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: Do 22.11.07 19:53 
 
Nicht schlecht. Ich habe aber auch eine Frage: Wo kann man sich die anderen 9 Sachen herunterladen, die kein Mensch braucht? |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Do 22.11.07 20:04 
 
Was für andere 9 Sachen?  _________________ We are, we were and will not be.
 |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: Do 22.11.07 20:18 
 
Dein Album, namens "10 Tolle Sachen, die kein Mensch braucht". Der einzige Song, den ich davon kenn ist "11 Sekunden feines Rauschen" von "Rainer Zufall". Ich find die Idee super.    |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Do 22.11.07 20:29 
 
Autsch. Ne, das ist ne Single-Auskopplung von einem Album, das nie erschienen ist   ._________________ We are, we were and will not be.
 |  |  |  
| YouAreDelphinated Hält's aus hier
 Beiträge: 2
 
 
 
 
 | 
Verfasst: Sa 05.01.08 23:35 
Titel: BUG!!
 
Mein erster Beitrag     und gleich einer mit nem Bug     ...
 Naja, in Zeile 1971 deiner Unit, Gausi, steht
 		                       Delphi-Quelltext 
 									| 1:
 | FPadding := GetPaddingSize(AudioDataSize + FDataSize + v1AdditionalPadding, FFilename, FUseClusteredPadding);					 |  Wo die Variable FFilename deklariert ist, weiß ich nicht. Auf jeden Fall ist diese Variable leer. Das führt beim ändern der Tags zu einem Fehler. Meine Lösung wäre (    falsch    ):
 		                       Delphi-Quelltext 
 									| 1:
 | FPadding := GetPaddingSize(AudioDataSize + FDataSize + v1AdditionalPadding, FrameName, FUseClusteredPadding);					 |  Trotzdem: Klasse Unit, sehr schnell und: Die 9 anderen Sachen sollte man mal machen    |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: So 06.01.08 10:55 
 
Hallo und    in der Entwickler-Ecke!
 Der Fehler tritt auf, wenn man nicht mit Dateien, sondern mit Streams arbeitet und ich dachte eigentlich, ich hätte den schon gefixed. Hab ich auch, aber nur lokal und dan irgendwann vergessen, die korrigierte Fassung hochzuladen.
 Problem ist die Funktion GetPaddingsize, bei der das Padding auch anhand der Clustergröße bestimmt wird. Die dazu gehörende API-Funktion wirft eine Exception, wenn man keinen Laufwerk/Dateinamen übergibt. Das private Feld fFilename wird beim lesen/schreiben des Tags aus/in eine(r) Datei gesetzt. Wenn man nur mit Streams arbeitet und so die Klasse nicht ermitteln kann, wo der Stream liegt, fehlt da ein Abfangen des Fehlers.
 Deine Lösung ist also falsch. Richtig wäre so eine Korrektur der Funktion GetPaddingSize:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 
 | function GetPaddingSize(DataSize: Int64; aFilename: WideString; UseClusterSize: Boolean): Cardinal;var
 Drive: string;
 ClusterSize           : Cardinal;
 SectorPerCluster      : Cardinal;
 BytesPerSector        : Cardinal;
 NumberOfFreeClusters  : Cardinal;
 TotalNumberOfClusters : Cardinal;
 begin
 Drive := WideExtractFileDrive(aFileName);
 if UseClusterSize  and (trim(Drive) <> '')  then
 begin
 if Drive[Length(Drive)]<>'\' then Drive := Drive+'\';
 try
 if GetDiskFreeSpace(PChar(Drive),
 SectorPerCluster,
 BytesPerSector,
 NumberOfFreeClusters,
 TotalNumberOfClusters) then
 ClusterSize := SectorPerCluster * BytesPerSector
 else
 ClusterSize := 2048;
 except
 ClusterSize := 2048;
 end;
 end else
 ClusterSize := 2048;
 Result := (((DataSize DIV ClusterSize) + 1) * Clustersize) - DataSize;
 end;
 | _________________ We are, we were and will not be.
 |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: So 06.01.08 12:09 
 
Ich denke, meine Frage kannst du gleich mit "nein" beantworten, aber ich stelle sie trotzdem mal     Hast du zufällig die Unit auch im Delph 3-Format? Ich würde sie gerne benutzen, aber da wären eine Menge Sachen zu ändern, und zum Beispiel offene Arrays gehen gar nicht. Da müsste ich schon Listen einsetzen, und ich glaube, dann könnte ich die Unit gleich selber machen     Also, wenn du irgendetwas in der Art kennst, das für Delphi 3 geschrieben ist, wäre ich dir sehr dankbar. |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: So 06.01.08 12:16 
 
Als Alternativen kenne ich die ATL (Audio Tools Library), die ich aber nur für den Read-Only-Einsatz empfehlen kann. Zum Schreiben ist die imho Murks, weil Informationen verloren gehen können. Besser ist auf jeden Fall noch die ID3Lib von Muetze1 aus der Delphi-Praxis, auch wenn ich mir die noch nicht genauer angeguckt habe (iirc kann die Version 2.2 des ID3Tags nicht schreiben, aber alle Informationen bleiben beim schreiben erhalten). Zuletzt ist bei den Jedis auch sowas dabei.
 Ob eins der drei für D3 geeignet ist, weiß ich nicht.  _________________ We are, we were and will not be.
 |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: So 06.01.08 12:19 
 
Ok, danke, ich werd's mir mal anschauen. Ein bisschen Umschreiben macht mir nichts, aber ich will halt nicht die komplette Unit neu verfassen.    |  |  |  
| YouAreDelphinated Hält's aus hier
 Beiträge: 2
 
 
 
 
 | 
Verfasst: Mo 07.01.08 01:10 
 
	  | Zitat: |  	  | Deine Lösung ist also falsch. Richtig wäre so eine Korrektur der Funktion GetPaddingSize: | 
 äh... Genau diese Funktion habe ich... Trotzdem crashed sie (aufgerufen wie original) bei
 		                       Delphi-Quelltext 
 									| 1:
 | if Drive[Length(Drive)]<>'\' then Drive := Drive+'\';					 |  mit einer Zugriffsverletzung (Lesen von Adresse FFFFFFFF). aFilename ist dabei übrigens ''. |  |  |  
| dsJena 
          Beiträge: 25
 
 Windows Vista
 
 
 | 
Verfasst: So 27.01.08 23:01 
 
Hallo,
 vielen Dank an Gausi für die gute Arbeit!
 Nun habe ich ein Problem..
 Und zwar klappt das Auslesen bzw. Berechnen der Spiellänge per
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 | mpegInfo:=TMpegInfo.create;mpeginfo.loadFromFile(playlist1.Items[0]);
 label3.Caption:=(inttostr(mpeginfo.dauer));
 mpegInfo.Free;
 |  super. Allerdings scheitere ich beim Auslesen per
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 | Id3v2Tag:=TId3v2Tag.Create;Id3v2Tag.ReadFromFile(playlist1.Items[0]);
 label4.Caption:=id3v2tag.artist;
 id3v2tag.Free;
 |  Im Label wird nämlich nichts angezeigt. Auch keine Fehlermeldung o.ä., einfach ein leeres Label.
 Zur Ergänzung: Playlist1.items[0] gibt den ersten Eintrag der Playlist zurück, das ist direkt der Dateiname. Label4 ist das betroffene Label.
 Ich habe mir schonmal den umfangreichen Beispielcode angeschaut, aber bis jetzt ohne Erfolg. Wie mache ich es richtig?
 Danke für die Hilfe!
 Viele Grüße,
 Daniel
 EDIT: Bei einigen Dateien funktioniert es komischerweise. Könnte es was mit den Versionen (V1/V2) zu tun haben? |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Mo 28.01.08 08:54 
 
Ich tippe einfach mal darauf, dass in den Dateien, wo es nicht funktioniert, kein ID3v2-Tag vorhanden ist, oder das Artist-Feld leer ist. Zum Auslesen solcher Infos mit dieser Unit für einen Player ist dieser Eintrag  in der Library hilfreich, oder das 2.Kapitel in diesem Tutorial . 
 Da wird erklärt, wie man recht komfortabel (d.h. ohne umfangreiche Code-Umbauten) einfach den "Artist" rausfinden kann, selbst wenn man hinterher ogg, wma oder sonstwas für Dateien hat._________________ We are, we were and will not be.
 |  |  |  
| dsJena 
          Beiträge: 25
 
 Windows Vista
 
 
 | 
Verfasst: Mo 28.01.08 09:40 
 
Hallo,
danke für die Antwort. Mit V1 geht es. Da lasse ich es erstmal so.
 |  |  |  
| Gausi  
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Mo 28.01.08 09:46 
 
Da wirst du dann bei anderen Dateien dasselbe Problem haben. Einige Dateien haben den v2-Tag, andere den v1-Tag, ziemlich viele haben beide, sehr wenige keinen. Deswegen ist es sinnvoll, beide Tags zu lesen, und das zu nehmen, was da ist.  _________________ We are, we were and will not be.
 |  |  |  |