Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8541
Erhaltene Danke: 477

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

ausblenden 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.

ausblenden 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.

ausblenden 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.

ausblenden 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

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



BeitragVerfasst: Mo 26.03.12 19:57 
Hi,
Thanks for share.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8541
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8541
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. :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: github.com/DanielGau...oWerkzeugeBibliothek

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: jaenicke, Sinspin