Autor Beitrag
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 11.07.07 19:03 
user profile iconjakobwenzel 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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
BeitragVerfasst: Do 12.07.07 08: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 12.07.07 20: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 12.07.07 21: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



BeitragVerfasst: So 12.08.07 23: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
BeitragVerfasst: So 16.09.07 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 22.11.07 20:53 
Nicht schlecht. Ich habe aber auch eine Frage: Wo kann man sich die anderen 9 Sachen herunterladen, die kein Mensch braucht?
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 22.11.07 21:04 
Was für andere 9 Sachen? :gruebel:

_________________
We are, we were and will not be.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 22.11.07 21: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. :D
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 22.11.07 21:29 
Autsch. Ne, das ist ne Single-Auskopplung von einem Album, das nie erschienen ist :mrgreen:.

_________________
We are, we were and will not be.
YouAreDelphinated
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 06.01.08 00:35 
Titel: BUG!!
Mein erster Beitrag :D und gleich einer mit nem Bug :oops: ...
Naja, in Zeile 1971 deiner Unit, Gausi, steht
ausblenden 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 :?: ):
ausblenden Delphi-Quelltext
1:
FPadding := GetPaddingSize(AudioDataSize + FDataSize + v1AdditionalPadding, FrameName, FUseClusteredPadding);					

Trotzdem: Klasse Unit, sehr schnell und: Die 9 anderen Sachen sollte man mal machen :lol:
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 06.01.08 11:55 
Hallo und :welcome: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 06.01.08 13:09 
Ich denke, meine Frage kannst du gleich mit "nein" beantworten, aber ich stelle sie trotzdem mal :wink:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 06.01.08 13: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. :nixweiss:

_________________
We are, we were and will not be.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 06.01.08 13: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. :wink:
YouAreDelphinated
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 07.01.08 02: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
ausblenden Delphi-Quelltext
1:
if Drive[Length(Drive)]<>'\' then Drive := Drive+'\';					

mit einer Zugriffsverletzung (Lesen von Adresse FFFFFFFF). aFilename ist dabei übrigens ''.
dsJena
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 25

Windows Vista

BeitragVerfasst: Mo 28.01.08 00: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

ausblenden 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 28.01.08 09: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 25

Windows Vista

BeitragVerfasst: Mo 28.01.08 10:40 
Hallo,
danke für die Antwort. Mit V1 geht es. Da lasse ich es erstmal so.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 28.01.08 10: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.