Audio Werkzeuge Bibliothek (AWB)

Eine Klassensammlung zum Anzeigen von Audio-Informationen (wie Dauer, Bitrate und Samplerate) und Bearbeiten von Metadaten (z.B. Interpret, Titel, Album) in vielen verschiedenen Audio-Formaten. Dabei wurde auf größtmögliche Einfachheit geachtet, ohne die Funktionsvielfalt einzuschränken.

Features

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

Kurzer Einstieg

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. 

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.

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.

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.

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 Werkzeuge Bibliothek (AWB) enthält (kleine) Teile der Audio Tools Library (ATL). Diese steht nur unter der LGPL. Da ich persönlich die Verwendung auch in Closed-Source-Software erlauben möchte, habe ich die Entwickler der ATL um Erlaubnis der Relizensierung unter der MPL gebeten, aber keine Antwort erhalten.

Da das Projekt ATL seit 2005 tot zu sein scheint und sich die übernommenen Teile auf das Ermitteln der Audio-Daten in den exotischeren Formaten beschränkt, habe ich mir die duale Lizenz auch ohne explizite Erlaubnis der ursprünglichen Urheber erlaubt.