MP3-Titelinformationen mit .NET auslesen
Geschrieben von: Björn Waide Ständig eintrudelnde Pressemeldungen über Schließungen von Peer-To-Peer Tauschbörsen wie Napster und Co. hin oder her, das MP3-Format erfreut sich ungebrochener Beliebtheit. Die Kompressionsrate ist bei guter Audio-Qualität hoch genug, um die gesamte heimische Platten- und CD-Sammlung auf gängige PC-Festplatten zu rippen. Tagelanger Musik-Genuss ohne CD-Wechsel ist die Folge. Ohne die auf den CD-Covern abgedruckten Informationen über Titel, Interpret und Sonstigem kann man jedoch schnell den Überblick über den Inhalt seiner Mega-Jukebox verlieren. Dankeswerterweise erlaubt es das MP3-Format, solche Informationen direkt mit in die Dateien zu schreiben. Dieser Artikel beschreibt, wie leicht man mit den Klassen des .NET-Frameworks diese Titelinformationen aus MP3-Dateien auslesen kann. Die Ergebnisse dieses kleinen HowTo's sind dem Artikel als Sourcecode beigelegt. ID3 TagsUm an die Meta-Daten zu einem MP3-File heranzukommen, muß man als Erstes wissen, wo und wie sie abgelegt sind. Zur Zeit gibt es zwei Standards mit den Namen ID3v1 und ID3v2. Diese legen fest, an welcher Stelle in einer MP3-Datei und mit wieviel Bytes eine bestimmte Information, z.B. die über den Interpreten, abgelegt ist. In diesem Artikel wird ausschließlich auf die Version 1 dieses Standards eingegangen. Eine informelle Übersicht findet sich in der nachstehenden Grafik. Im Anhang zur Spezifikation der aktuellen ID3 Version ID3v2.4.0 findet sich die genaue Definition. Die Informationen stehen, sofern sie vorhanden sind, in den letzten 128 Bytes einer MP3-Datei. Sie werden mit der Zeichenfolge "TAG" eingeleitet. Danach stehen in dieser Reihenfolge die interessierenden Daten:
Auslesen der InformationenMit diesem Wissen ausgerüstet können wir uns daran wagen, das Ganze mit C# zu realisieren. Mit Hilfe der Klassen aus dem Namespace System.IO des .NET-Frameworks lesen wir zuerst die letzten 128 Byte der Datei aus. Dazu öffnen wir in den Zeilen 1 und 2 des nachfolgenden Listings einen Stream auf die jeweilige Datei und "spulen" in Zeile 5 bis auf diese letzten Bytes vor. Über die Methode Read des Stream-Objektes lesen wir in Zeile 9 diese letzten 128 Bytes nun schrittweise in ein Byte-Array. FileInfo file = new FileInfo(this.Filename); Stream s = file.OpenRead(); byte[] bytes = new byte[128]; s.Seek(-128, SeekOrigin.End); int numBytesToRead = 128; int numBytesRead = 0; while (numBytesToRead > 0) { int n = s.Read(bytes, numBytesRead, numBytesToRead); if (n==0) { break; } numBytesRead += n; numBytesToRead -= n; } s.Close(); Parsen der ID3 TagsNachdem das geschafft ist, muß der Inhalt dieses Byte-Arrays noch anhand der Angaben aus der ID3-Spezifikation "geparsed" werden. Aufgrund der festen Längen der einzelnen Abschnitte ist das ein leichtes Unterfangen. Wir verwenden hierzu die Methode ConvertByteToString, die einen bestimmten Abschnitt des übergebenen Byte-Arrays als String zurückgibt. private static String ConvertByteToString(byte[] bytes, int pos1, int pos2) { //pos2 muß größer oder gleich pos1 sein und //pos2 darf Länge des Arrays nicht überschreiten if ((pos1 > pos2) || (pos2 > bytes.Length - 1)) { throw new ArgumentException("Aruments out of range"); } //Länge des zu betrachtenden Ausschnittes int length = pos2 - pos1 + 1; //neues Char-Array anlegen der Länge length Char[] chars = new Char[length]; //packe alle Bytes von pos1 bis pos2 als //Char konvertiert in Array chars for (int i = 0; i < length; i++) { chars[i] = Convert.ToChar(bytes[i + pos1]); }//end for //konvertiere Char-Array in String und gebe es zurück return new String(chars); } Wir brauchen nun eigentlich nur noch die Tabelle 1 aus dem Abschnitt "ID3 Tags" abzutippen. Vorher ist jedoch noch darauf zu achten, daß die eingelesene Datei auch wirklich ID3-Informationen enthält. Dem ist so, wenn in den ersten drei Bytes unseres Byte-Arrays das Wort "TAG" steht. String tag = ConvertByteToString(bytes, 0, 2); if (tag != "TAG") { return false; } m_title = ConvertByteToString(bytes, 3, 32); m_artist = ConvertByteToString(bytes, 33, 62); m_album = ConvertByteToString(bytes, 63, 92); m_year = Int32.Parse(ConvertByteToString(bytes, 93, 96)); m_comment = ConvertByteToString(bytes, 97, 126); m_genre = bytes[127]; Damit haben wir schon den wichtigsten Teil, das Auslesen der Daten, erledigt. Mit ein wenig schmückendem Code-Beiwerk erhält man so eine leicht zu benutzende Klasse. Der beiliegende Source Code enthält neben der eigentlichen Mp3File Klasse zwei kleine Beispiele, wie man die gewonnenen Daten darstellen kann: Einmal an der Kommandozeile und - etwas schöner und komfortabler - ein anderes Mal als DataGrid auf einer Web-Seite. Dieses zweite Beispiel demonstriert dabei auch noch das DataBinding mit Standard-Collections und eigenen Objekten. SchlußbemerkungWie man sieht, ist es mit ein wenig Hintergrundwissen und den Klassen des .NET-Frameworks sehr leicht möglich, an die Titelinformationen von MP3-Dateien zu gelangen. Als Hausaufgabe verbleibt dem Leser die Implementierung des ID3v2-Standards, der wesentlich mehr Felder bei variabler Feldlänge bietet. Nähere Informationen zu diesem Thema finden sich auf den Seiten der ID3.org. Download des CodesKlicken Sie hier, um den Download zu starten. Links zu anderen SitesWenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |