Entwickler-Ecke

Open Source Units - Audio Werkzeuge Bibliothek (AWB)


Gausi - So 18.03.12 19:29
Titel: Audio Werkzeuge Bibliothek (AWB)
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

Weitere Features

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;

// ... und zum Bearbeiten
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; // a ListView on the Form
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;
    // Modern versions of Delphi also recognize the graphic type when using LoadFromStream
    // For older versions, you may have to adapt the code depending on the mimetype.
    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 [https://github.com/DanielGausi/AudioWerkzeugeBibliothek]

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. ;-)


Servite - Mo 26.03.12 20:57

Hi,
Thanks for share.


Gausi - Do 05.04.12 12: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 [http://www.gausi.de/awb.html] jetzt auch. :)


Gausi - Mi 23.10.24 15: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. :shock:

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. 8)

Die AWB gibt es seit einiger Zeit auch auf Github: https://github.com/DanielGausi/AudioWerkzeugeBibliothek