<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MP3: ID3v2 auslesen]]></title><description><![CDATA[<p>Ich möchte gerne die Metadaten von MP3-Dateien auslesen, nur die Standardsachen (Künstler, Titel, Album, ...). Für ID3v1 funktioniert das ganze schon prima. Nur komme ich bei ID3v2 nicht so recht weiter.</p>
<p>In ID3v2 hat ja jedes Element einen Identifier. Wenn ich jetzt z. B. den Künstler suche, muss ich nach TPE1 suchen. Wie kann ich das in der Funktion getId3v2Tag effizient realisieren?</p>
<p>Meine Idee war es, alle Tags auszulesen und in ein Liste zu packen um sie dann anschließend zuzuordnen. Nur wie erkenne ich am besten, wann ein neuer Tag anfängt und der alte aufhört?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iomanip&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;
#include &lt;vector&gt;
#include &lt;fstream&gt;
#include &lt;windows.h&gt;

using namespace std;

struct id3v1 {
	char title[30];
	char artist[30];
	char album[30];
	char year[4];
	char comment[28];
	char track[2];
	char genere[1];
};

struct id3v2 {
	char title[];
	char artist[];
	char album[];
	char year[];
	char comment[];
	char track[];
	char genere[];
};

string *getId3v2Tag(string id) {

	return 0;
}

id3v2 *readId3v2(string path) {
	// Datei öffnen
	fstream media;
	media.open(path.c_str(), ios::in | ios::binary);

	// wenn nicht Einleitung mit &quot;ID3&quot; dann keine Id3v2 Informationen
	char id[3];
	media.read(id, 3);
	if (strncmp(id, &quot;ID3&quot;, 3) != 0) return 0;

	// Tag lesen
	id3v2 *tag = new id3v2;	
	//tag-&gt;title  = getId3v2Tag(&quot;TIT2&quot;);
	//tag-&gt;artist = getId3v2Tag(&quot;TPE1&quot;);
	//tag-&gt;album  = getId3v2Tag(&quot;TALB&quot;);
	//tag-&gt;year   = getId3v2Tag(&quot;TDRC&quot;);
	//tag-&gt;track  = getId3v2Tag(&quot;TRCK&quot;);

	// Datei schließen
	media.close();

	// Ausgabe Konsole
	cout &lt;&lt; path &lt;&lt; endl;
	cout &lt;&lt; &quot;TITLE  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;title   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;ARTIST : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;artist  &lt;&lt; endl;
	cout &lt;&lt; &quot;ALBUM  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;album   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;YEAR   : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;year    &lt;&lt; endl;
	cout &lt;&lt; &quot;COMMENT: &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;comment &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;TRACK  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;track   &lt;&lt; endl;
	cout &lt;&lt; &quot;GENERE : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;genere  &lt;&lt; endl;

	return tag;
}

/*
 * ID3 Informationen auslesen
 * letzten 128 Zeichen lesen und auswerten
 * title[30] + artist[30] + album[30] + year[4] + comment[28] + track[2] + genere[1]
 */
id3v1 *readId3v1(string path) {
	// Datei öffnen
	fstream media;
	media.open(path.c_str(), ios::in | ios::binary);

	// &quot;Vorspulen&quot; und die letzten 128 Zeichen einlesen
	char input[128];
	media.seekg(-128, ios::end);

	// wenn nicht Einleitung mit &quot;TAG&quot; dann keine Id3v1 Informationen
	char id[3];
	media.read(id, 3);
	if (strncmp(id, &quot;TAG&quot;, 3) != 0) return 0;

	// Tag lesen
	id3v1 *tag = new id3v1;
	media.read(tag-&gt;title, 30);
	media.read(tag-&gt;artist, 30);
	media.read(tag-&gt;album, 30);
	media.read(tag-&gt;year, 4);
	media.read(tag-&gt;comment, 28);
	media.read(tag-&gt;track, 2);
	media.read(tag-&gt;genere, 1);

	// Datei schließen
	media.close();

	// Ausgabe Konsole
	cout &lt;&lt; path &lt;&lt; endl;
	cout &lt;&lt; &quot;TITLE  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;title   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;ARTIST : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;artist  &lt;&lt; endl;
	cout &lt;&lt; &quot;ALBUM  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;album   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;YEAR   : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;year    &lt;&lt; endl;
	cout &lt;&lt; &quot;COMMENT: &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;comment &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;TRACK  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;track   &lt;&lt; endl;
	cout &lt;&lt; &quot;GENERE : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;genere  &lt;&lt; endl;

	return tag;
}

void scanDir(string path) {
	HANDLE fHandle;
	WIN32_FIND_DATA wfd;

	fHandle = FindFirstFile((path + &quot;\\*&quot;).c_str(), &amp;wfd);

	do {
		// Wenn . oder .. dann weiter
		if (wfd.cFileName[0] == '.' &amp;&amp; wfd.cFileName[1] == 0) continue;
		if (wfd.cFileName[0] == '.' &amp;&amp; wfd.cFileName[1] == '.' &amp;&amp; wfd.cFileName[2] == 0) continue;
		// Wenn Ordner -&gt; scanne Unterordner
		if (wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
			scanDir(path + &quot;\\&quot; + wfd.cFileName);
		// Sonst Datei -&gt; ausgeben
		else {
			string fileName = wfd.cFileName;
			// nur Dateien mit der Endung mp3
			if (fileName.substr(fileName.length()-3, 3) == &quot;mp3&quot;)
				readId3v1(path + &quot;\\&quot; + fileName);
		}
	} while (FindNextFile(fHandle, &amp;wfd));

	FindClose(fHandle);
}

int main() {
	scanDir(&quot;D:\\Friska Viljor&quot;);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/246467/mp3-id3v2-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:51:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246467.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jul 2009 17:47:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MP3: ID3v2 auslesen on Tue, 28 Jul 2009 17:47:53 GMT]]></title><description><![CDATA[<p>Ich möchte gerne die Metadaten von MP3-Dateien auslesen, nur die Standardsachen (Künstler, Titel, Album, ...). Für ID3v1 funktioniert das ganze schon prima. Nur komme ich bei ID3v2 nicht so recht weiter.</p>
<p>In ID3v2 hat ja jedes Element einen Identifier. Wenn ich jetzt z. B. den Künstler suche, muss ich nach TPE1 suchen. Wie kann ich das in der Funktion getId3v2Tag effizient realisieren?</p>
<p>Meine Idee war es, alle Tags auszulesen und in ein Liste zu packen um sie dann anschließend zuzuordnen. Nur wie erkenne ich am besten, wann ein neuer Tag anfängt und der alte aufhört?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iomanip&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;
#include &lt;vector&gt;
#include &lt;fstream&gt;
#include &lt;windows.h&gt;

using namespace std;

struct id3v1 {
	char title[30];
	char artist[30];
	char album[30];
	char year[4];
	char comment[28];
	char track[2];
	char genere[1];
};

struct id3v2 {
	char title[];
	char artist[];
	char album[];
	char year[];
	char comment[];
	char track[];
	char genere[];
};

string *getId3v2Tag(string id) {

	return 0;
}

id3v2 *readId3v2(string path) {
	// Datei öffnen
	fstream media;
	media.open(path.c_str(), ios::in | ios::binary);

	// wenn nicht Einleitung mit &quot;ID3&quot; dann keine Id3v2 Informationen
	char id[3];
	media.read(id, 3);
	if (strncmp(id, &quot;ID3&quot;, 3) != 0) return 0;

	// Tag lesen
	id3v2 *tag = new id3v2;	
	//tag-&gt;title  = getId3v2Tag(&quot;TIT2&quot;);
	//tag-&gt;artist = getId3v2Tag(&quot;TPE1&quot;);
	//tag-&gt;album  = getId3v2Tag(&quot;TALB&quot;);
	//tag-&gt;year   = getId3v2Tag(&quot;TDRC&quot;);
	//tag-&gt;track  = getId3v2Tag(&quot;TRCK&quot;);

	// Datei schließen
	media.close();

	// Ausgabe Konsole
	cout &lt;&lt; path &lt;&lt; endl;
	cout &lt;&lt; &quot;TITLE  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;title   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;ARTIST : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;artist  &lt;&lt; endl;
	cout &lt;&lt; &quot;ALBUM  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;album   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;YEAR   : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;year    &lt;&lt; endl;
	cout &lt;&lt; &quot;COMMENT: &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;comment &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;TRACK  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;track   &lt;&lt; endl;
	cout &lt;&lt; &quot;GENERE : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;genere  &lt;&lt; endl;

	return tag;
}

/*
 * ID3 Informationen auslesen
 * letzten 128 Zeichen lesen und auswerten
 * title[30] + artist[30] + album[30] + year[4] + comment[28] + track[2] + genere[1]
 */
id3v1 *readId3v1(string path) {
	// Datei öffnen
	fstream media;
	media.open(path.c_str(), ios::in | ios::binary);

	// &quot;Vorspulen&quot; und die letzten 128 Zeichen einlesen
	char input[128];
	media.seekg(-128, ios::end);

	// wenn nicht Einleitung mit &quot;TAG&quot; dann keine Id3v1 Informationen
	char id[3];
	media.read(id, 3);
	if (strncmp(id, &quot;TAG&quot;, 3) != 0) return 0;

	// Tag lesen
	id3v1 *tag = new id3v1;
	media.read(tag-&gt;title, 30);
	media.read(tag-&gt;artist, 30);
	media.read(tag-&gt;album, 30);
	media.read(tag-&gt;year, 4);
	media.read(tag-&gt;comment, 28);
	media.read(tag-&gt;track, 2);
	media.read(tag-&gt;genere, 1);

	// Datei schließen
	media.close();

	// Ausgabe Konsole
	cout &lt;&lt; path &lt;&lt; endl;
	cout &lt;&lt; &quot;TITLE  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;title   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;ARTIST : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;artist  &lt;&lt; endl;
	cout &lt;&lt; &quot;ALBUM  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;album   &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;YEAR   : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;year    &lt;&lt; endl;
	cout &lt;&lt; &quot;COMMENT: &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;comment &lt;&lt; &quot;   &quot;;
	cout &lt;&lt; &quot;TRACK  : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;track   &lt;&lt; endl;
	cout &lt;&lt; &quot;GENERE : &quot; &lt;&lt; setw(30) &lt;&lt; tag-&gt;genere  &lt;&lt; endl;

	return tag;
}

void scanDir(string path) {
	HANDLE fHandle;
	WIN32_FIND_DATA wfd;

	fHandle = FindFirstFile((path + &quot;\\*&quot;).c_str(), &amp;wfd);

	do {
		// Wenn . oder .. dann weiter
		if (wfd.cFileName[0] == '.' &amp;&amp; wfd.cFileName[1] == 0) continue;
		if (wfd.cFileName[0] == '.' &amp;&amp; wfd.cFileName[1] == '.' &amp;&amp; wfd.cFileName[2] == 0) continue;
		// Wenn Ordner -&gt; scanne Unterordner
		if (wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
			scanDir(path + &quot;\\&quot; + wfd.cFileName);
		// Sonst Datei -&gt; ausgeben
		else {
			string fileName = wfd.cFileName;
			// nur Dateien mit der Endung mp3
			if (fileName.substr(fileName.length()-3, 3) == &quot;mp3&quot;)
				readId3v1(path + &quot;\\&quot; + fileName);
		}
	} while (FindNextFile(fHandle, &amp;wfd));

	FindClose(fHandle);
}

int main() {
	scanDir(&quot;D:\\Friska Viljor&quot;);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1751097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1751097</guid><dc:creator><![CDATA[multiholle]]></dc:creator><pubDate>Tue, 28 Jul 2009 17:47:53 GMT</pubDate></item></channel></rss>