Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

MP3-Titelinformationen mit .NET auslesen

Geschrieben von: Björn Waide
Kategorie: .NET Allgemein

This printed page brought to you by AlphaSierraPapa

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 Tags

Um 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:

Song title30 Zeichen
Artist30 Zeichen
Album30 Zeichen
Year4 Zeichen
Comment30 Zeichen
Genre1 Byte

Auslesen der Informationen

Mit 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 Tags

Nachdem 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ßbemerkung

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

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20030430.zip

Links zu anderen Sites

ID3.org
http://www.id3.org

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.