Hier zwei Beispiele über die ersten Schritte mit der Sound-Klasse in AS3. Dazu gehören das Abspielen und das Auslesen von Künstler, Songname, Album und Cover.

Cover laden aus ID3 Tags mit Actionscript 3

Mit der Sound-Klasse lädt und startet man MP3-Dateien in ActionScript 3. Ein wichtiges Event, dass ausgelöst wird, wenn die MP3-Datei geladen wurde, heißt Event.COMPLETE. Im Beispiel wird daraufhin die Funktion showDuration gestartet. Die Funktion liest die Eigenschaft length (=Länge des Songs) des Sound-Objekts aus, die einen Wert in Millisekunden enthält. Dieser wird mittels eines Date-Objekts (vgl. "AS3 Date-Klasse ...") in die Form Minuten/Sekunden gewandelt.

Ein anderes Event mit dem Namen Event.ID3 gibt Auskunft über die in der Datei enthaltenen Metadaten (z.B. Songname, Künstler, Album, etc.), die so genannten ID3-Tags. Diese enthalten eine Vielzahl an Information, sind jedoch in unterschiedlicher Anzahl vorhanden. Nicht jedes Programm injiziert die gleichen Daten. Eine Übersicht der unterstützten ID3-Tags in Flash und deren Namen gibt es in der Dokumentation (Link siehe unten).

Hier der Beispielcode in AS3, der eine Datei mit dem Namen steely.mp3 abspielt:

Actionscript:
  1. // Sound laden
  2. var mySound:Sound = new Sound(new URLRequest("steely.mp3"));
  3.  
  4. // Sound starten
  5. mySound.play();
  6.  
  7. // :::::: wenn das MP3 soweit geladen ist :::::
  8.  
  9. mySound.addEventListener (Event.COMPLETE, showDuration);
  10. function showDuration(evt:Event) {
  11.     // die Länge in Millisekunden
  12.     var mySoundDuration:Date = new Date (2007, 0, 1, 0, 0, 0, mySound.length);
  13.     trace ("Länge: " + mySoundDuration.getMinutes() + ":" + mySoundDuration.getSeconds());
  14. }
  15.  
  16.  
  17. // ::::: ID3-Tags auslesen :::::
  18. mySound.addEventListener (Event.ID3, showID3);
  19.  
  20. function showID3(evt:Event) {
  21.     var myID3:ID3Info = evt.target.id3;
  22.     trace ("Künstler: " + myID3.artist +"\nSong: " + myID3.songName + "\nAlbum: "+ myID3.album);   
  23. }

Das Ausgabefenster zeigt bei meinem Beispielsong folgendes an:

Output Actionscript 3 MP3

Leider gehört das Covers (Artworks) nicht dazu. Hierzu gibt es aber eine Flex Komponente von Ben Stucki, die den Bytestrom eines MP3s ausliest. Das Cover kann man dann mit einem Loader anzeigen (vgl. auch Beitrag "JPGs aus einem Video erstellen")

Da Flex bekanntlich ebenfalls ActionScript 3 verwendet, lassen sich die Klassen von Stucki problemlos mit Flash 9 (Alpha) verwenden. Ein Screenshot des Ergebnisses sieht man zu Beginn des Beitrags.

Die Vorgehensweise sieht so aus: Man kopiert einfach den Ordner com aus dem Download von Stucki in das Verzeichnis der eigenen Flashdatei. Man erstellt eine neue Datei mit drei Textfeldern auf der Bühne, deren Instanznamen songArtist, songTitle und songAlbum lauten sollten. Die ursprüngliche Funktionen der Flex-Datei (.mxml) sehen in Flash leicht abgewandelt dann folgendermaßen aus:

Actionscript:
  1. import com.fusiox.media.ID3Stream;
  2.        
  3. function loadID3( file:String ):void {
  4.             var stream:ID3Stream = new ID3Stream( new URLRequest(file) );
  5.             stream.addEventListener( ProgressEvent.PROGRESS, onID3Progress );
  6.             stream.addEventListener( Event.ID3, onID3Loaded );
  7. }
  8.        
  9. function onID3Progress( e:ProgressEvent ):void {
  10.     if (e.target.length> 0  && e.bytesLoaded target.length) {
  11.                 trace ("ID3Stream Explorer [Loading " + Math.round(e.bytesLoaded/e.target.length*100) + "%]");
  12.     }
  13. }
  14.        
  15. function onID3Loaded( e:Event ):void {
  16.     trace ("ID3Stream Explorer");
  17.     if (e.target.reader.img.length>0) {
  18.         songArt.loadBytes(e.target.reader.img);
  19.         addChild (songArt);
  20.     }
  21.     songTitle.text = "Song Title: " + e.target.reader.frames["TIT2"].text;
  22.     songArtist.text = "Song Artist: " + e.target.reader.frames["TPE1"].text;
  23.     songAlbum.text = "Song Album: " + e.target.reader.frames["TALB"].text;
  24. }
  25.  
  26. var songArt:Loader = new Loader();
  27.  
  28. loadID3 ("steely.mp3");

Mit manchen MP3s funktioniert es bei mir nicht. Hängt vermutlich damit zusammen, welche Software die ID3-Tags eingefügt hat. Probleme machten bei mir einige iTunes-MP3s.

Link: Sound-Klasse
Link: ID3-Klasse (ActionScript Docs)
Link: Free ID3Stream and ID3Reader Components for Flex 2 (Ben Stucki)