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 einigen Jahren nicht weiter gepflegt wird und einen ähnlichen Funktionsumfang, aber auch ein paar sehr unschöne Eigenschaften hat (besonders in bezug auf mp3-Dateien).

Features (Zusammenfassung)

Getestet mit Delphi 7 und Delphi 2009. Delphi 6 sollte auch noch laufen, bei Delphi 5 machen die Mp3FileUtils Probleme.


Die Unit AudioFiles.pas mit der Klasse TAudioFile

Die Superklasse. Folgender Code (leicht gekürzt) reicht, um einen Basis-Tagger für alle Formate zu erzeugen:

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:
procedure TSimpleTagger.FileListBox1Change(Sender: TObject);
begin
    MainAudioFile := TAudioFile.Create(FileListBox1.FileName);
    EdtTitle.Text  := MainAudioFile.Title;
    EdtArtist.Text := MainAudioFile.Artist;
    EdtAlbum.Text  := MainAudioFile.Album;
    EdtGenre.Text  := MainAudioFile.Genre;
    EdtYear.Text   := MainAudioFile.Year;
    EdtTrack.Text  := MainAudioFile.Track;
    Memo1.Clear;
    Memo1.Lines.Add(Format('Type:      %s',       [MainAudioFile.FileTypeName] ));
    Memo1.Lines.Add(Format('FileSize   %d Bytes', [MainAudioFile.FileSize]     ));
    Memo1.Lines.Add(Format('Duration   %d sec',   [MainAudioFile.Duration]     ));
    Memo1.Lines.Add(Format('Btrate     %d kBit/s',[MainAudioFile.Bitrate div 1000]));
    Memo1.Lines.Add(Format('Samplerate %d Hz',    [MainAudioFile.Samplerate]   ));
    Memo1.Lines.Add(Format('Channels:  %d',       [MainAudioFile.Channels]     ));
end;

procedure TSimpleTagger.BtnSaveClick(Sender: TObject);
begin
    MainAudioFile.Title  := EdtTitle.Text ;
    MainAudioFile.Artist := EdtArtist.Text;
    MainAudioFile.Album  := EdtAlbum.Text ;
    MainAudioFile.Genre  := EdtGenre.Text ;
    MainAudioFile.Year   := EdtYear.Text  ;
    MainAudioFile.Track  := EdtTrack.Text ;
    MainAudioFile.UpdateFile;
end;


Die Klassen <*>Files.pas mit den Klassen T<*>File

Abgeleitet von der abstrakten Basisklasse TBaseAudioFile implementieren diese Klassen die Basismethoden und liefern - je nach Typ - weitere Informationen aus den Dateien. Die Klasse TAudioFile hat dafür die Properties <*>File, über die weiterführender Zugriff möglich ist. Das wird in der ExtendedDemo vorgeführt. Die Dateitypen, die ApeTags nutzen, sind dabei von einer Zwischenklasse TBaseApeFile in der Unit Apev2Tags.pas abgeleitet. Die Klasse TMp3File hat als Property auch Id3v2Tag, über den dann der ganze Quatsch möglich ist, der in den MP3FileUtils-Demos beschrieben wird.

Bei den Methoden T<*>File.ReadFromFile bzw. WriteToFile wird bzgl. der Meta-Tags (ID3, ApeV2, Ogg-Vorbis-Comments) folgendes angenommen:


Lizenz

LGPL oder MPL

Die Audio Tools Library, von denen hier auch einiges drin steckt, stehen nur unter der LGPL. Da ich auf eine Anfrage keine Antwort bekommen habe, das Projekt seit einigen 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. :)