Autor |
Beitrag |
Gausi
Beiträge: 8541
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 18.03.12 18:29
Nach Mp3FileUtils und Flogger kommt jetzt die vermutlich letzte Open Source Unit zum Thema Audio- und Metadaten von mir. Wenn weiteres kommt, dann wird das hier eingepflegt.
Audio Werkzeuge Bibliothek (AWB)
Der Name ist ein direkte Anlehnung an die Audio Tools Library, die seit mittlerweile fast 20 Jahren nicht weiter gepflegt wird. Die ATL hat einen ähnlichen Funktionsumfang, aber auch ein paar sehr unschöne Eigenschaften (besonders in Bezug auf mp3-Dateien) - bis hin zu konzeptionell bedingtem Datenverlust.
Unterstützte Tagformate
- ID3Tag, Version 1 and 1.1 (mp3, ape, mpc, ofr, tta, wv)
- ID3Tag, Version 2.2, 2.3 and 2.4 (mp3)
- Apev2Tags (mp3, ape, mpc, ofr, tta, wv)
- Vorbis Comments (ogg, flac, opus)
- QuickTime Metadata (mp4, m4a)
- WindowsMediaAudio (wma, read-only)
Weitere Features
- Lesen und Schreiben von Cover-Art in ID3v2, Apev2, Flac, Vorbis
- Ermitteln von Spieldauer, Samplerate, Bitrate, Channels in folgenden Dateitypen: Mp3, Ogg-Vorbis (*.ogg), Opus (*.opus), Flac (*.flac), Monkeys Audio (*.ape), Musepack (*.mpc), Wavpack (*.wv), OptimFrog (*.ofr), True Audio (*.tta), Windows Media Audio (*.wma), Wave-Dateien (*.wav)
- Volle Unicode-Unterstützung (ggf. über Compilerschalter in der config.inc und die TNT Unicode Controls)
- Umfangreiche Tag-Unterstützung, z.B. Lyrics und "Private Frames" bei ID3v2, Direktzugriff auf ID3v2-Frames, Zugriff auf beliebige Werte bei Ogg-Vorbis und Apev2. Wer also eine mp3-Datei in den Apev2Tag einer OptimFrog-Datei speichern möchte, kann das mit den bereitgestellten Methoden tun. Ob das eine gute Idee ist, weiß ich allerdings nicht...
Die ursprüngliche Version wurde getestet mit Delphi 7 und Delphi 2009. Die aktuelle Version wurde mit der Community Edition 11.3 entwickelt. Mit ggf. kleinen Anpassungen sollte das weiterhin unter Delphi 7 laufen (Die enthaltenen Demo-Projekte aber sicherlich nicht.)
Kurzer Einstieg in die Verwendung
Der Einstieg ist denkbar einfach. Über das globale AudioFileFactory-Object eine passende Instanz eines TBaseAudioFile erzeugen lassen, und auf die gängigen Properties zugreifen. Dabei ist es egal, ob es sich bei 'aFileName' um eine mp3-Datei mit ID3v1- oder v2-Tag handelt, oder eine Ogg-Vorbis-Datei, Flac, Monkeys Audio, WMA, oder exotische Formate wie Musepack, Optimfrog oder True Audio mit Apev2-Tag handelt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var MainAudioFile: TBaseAudioFile; MainAudioFile := AudioFileFactory.CreateAudioFile(aFileName); MainAudioFile.ReadFromFile(aFileName); EditTitle.Text := MainAudioFile.Title;
MainAudioFile.Title := EditTitle.Text; MainAudioFile.UpdateFile; |
Um alle enthaltenen Metadaten aufzulisten, gibt es die Methode GetTagList. Diese Liste kann z.B. in einer ListView angezeigt werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| lvMetaTags.Clear; TagItems := TTagItemList.Create; try MainAudioFile.GetTagList(TagItems); for i := 0 to TagItems.Count - 1 do begin newListItem := lvMetaTags.Items.Add; newListItem.Data := TagItems[i]; newListItem.Caption := cTagTypes[TagItems[i].TagType]; newListItem.SubItems.Add(TagItems[i].Key); newListItem.SubItems.Add(TagItems[i].Description); newListItem.SubItems.Add(TagItems[i].GetText(tmReasonable)); end; finally TagItems.Free; end; |
Zum Bearbeiten (oder Löschen) eines Elements kann folgender Code benutzt werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| editItem := TTagItem(lvMetaTags.Selected.Data); editValue := editItem.GetText(tmReasonable); if InputQuery('Edit Item', 'New value:', editValue) then begin if editValue = '' then MainAudioFile.DeleteTagItem(editItem) else TTagItem(editItem).SetText(editValue, tmReasonable); end; |
Die Anzeige von Bildern ist nicht ganz trivial, aber immer noch recht einfach zu machen. Ein Problem dabei ist, dass durchaus mehrere Bilder in den Metadaten enthalten sein können. In den meisten Fällen ist aber nur eines enthalten, und das erhält man mit folgendem einfachen Code.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var stream: TMemoryStream; Mime: AnsiString; PicType: TPictureType; Description: UnicodeString
stream := TMemoryStream.Create; try if MainAudioFile.GetPicture(stream, Mime, PicType, Description) then begin Stream.Position := 0; Image1.Picture.LoadFromStream(Stream); end; finally stream.Free; end; |
Für weitere Details und Möglichkeiten verweise ich auf die enthaltenen Demo-Projekte oder die Readme auf Github, AudioWerkzeugeBibliothek auf Github
Lizenz
LGPL oder MPL
Die Audio Tools Library, von denen hier auch noch ein wenig drin steckt, stehen nur unter der LGPL. Da ich auf eine Anfrage keine Antwort bekommen habe, das Projekt seit vielen Jahren nicht mehr weiter entwickelt wird, und der Anteil von ATL-Code nicht sonderlich groß ist, habe ich mir die Dual-Lizenz einfach so erlaubt.
Einloggen, um Attachments anzusehen!
_________________ We are, we were and will not be.
Zuletzt bearbeitet von Gausi am Mi 23.10.24 13:51, insgesamt 3-mal bearbeitet
|
|
Servite
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 26.03.12 19:57
|
|
Gausi
Beiträge: 8541
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 05.04.12 11:42
Beim Einbau in meinen Player sind mir noch ein paar Dinge aufgefallen, die anders besser wären. Was das genau war, weiß ich jetzt nicht mehr, aber da die Anzahl der Nutzer dieser Klassen hier doch recht überschaubar ist, habe ich diese ersten Änderungen nicht dokumentiert. Zum Beispiel kann jetzt der Fehlercode abgefragt werden, der im Constructor der Hauptklasse (bzw. beim Einlesen der Daten aus der übergebenenen Datei) ermittelt wird.
Neu hinzugekommen sind noch Read-Only-Klassen für wav und wma, und auf meiner Webseite gibt es die Audio Werkzeuge Bibliothek jetzt auch.
_________________ We are, we were and will not be.
|
|
Gausi
Beiträge: 8541
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 23.10.24 14:09
Nach gut 10 Jahren hier auch mal wieder ein Update. Ausgehend von dem Feature-Request im Nemp-Thread habe ich hier die Unterstützung von OPUS-Dateien eingebaut.
In den wenigen Beispieldateien, die mir zur Verfügung gestellt wurden, waren natürlich auch direkt Cover eingebettet. Ein Teil, den ich bisher für OggVorbis-Kommentare der Einfachheit wegen ignoriert habe. Da Vorbis-Kommentare rein textbasiert sind, werden die Bilder werden darin Base64-Kodiert gespeichert. Das ist noch das kleinere Problem - das größere ist, dass dadurch in der Regel die maximal erlaubte Größe für eine "OggPage" (eine Einheit in dem Ogg-Container-Format) überschritten wird. Und weil die OggPages durchnummeriert sein müssen, und auch eine Checksumme enthalten (die die Seitenzahl mit einschließt), ist das Einfügen einer Seite mit einem ziemlich großem Aufwand verbunden. Man muss auf jeder einzelnen Seite die Seitenzahl ändern und die Checksumme neu berechnen.
Und dann habe ich generell im Code etwas aufgeräumt, und einiges der Programmlogik in die Library verschoben, die ich z.B. in Nemp brauchte zum Laden von Bildern aus den unterschiedlichen Formaten, oder auch für die Auflistung aller enthaltenen Metadaten. Das war ein recht umfangreiches Refactoring, das sich aber hoffentlich gelohnt hat.
Aktuell ist Version 3.1 - nach dem Release von 3.0 habe ich das in Nemp einbauen wollen, und dabei ein paar Kleinigkeiten vermisst, und auch ein paar Bugs gefunden.
Die AWB gibt es seit einiger Zeit auch auf Github: github.com/DanielGau...oWerkzeugeBibliothek
_________________ We are, we were and will not be.
Für diesen Beitrag haben gedankt: jaenicke, Sinspin
|
|
|