Este es el código que uso para leer el archivo mp3, pueden probarlo y les muestra los tag,s título, album, los priv, todo, esta para la versión de ID3v2.3.0, espero puedan ayudarme, lo que se quiere es que se le va a mostrar al usuario algo así, ejemplo:
Nombre de la canción: cancionblablabla
Álbum: blablba
Año: 1997
entonces esos datos entran como tag a la canción, gracias.
Nombre de la canción: cancionblablabla
Álbum: blablba
Año: 1997
entonces esos datos entran como tag a la canción, gracias.
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
//-------------------------------------------------------------------------
typedef unsigned char byte;
typedef unsigned int uint;
typedef struct synch {
byte b3,b2,b1,b0;
} sint;
//-------------------------------------------------------------------------
struct header
{
char mark[3];
byte version[2];
byte flags;
sint size;
};
//-------------------------------------------------------------------------
struct frame
{
char id[4];
sint size;
byte flags[2];
};
//-------------------------------------------------------------------------
uint usych(sint value)
{
return value.b0|value.b1<<8|value.b2<<16|value.b3<<24;
}
//-------------------------------------------------------------------------
int main()
{
FILE *file=fopen("D:/Programacion/P1/ID3/cancion.mp3","r");
if(!file)
{
cout<<"File not found"<<endl;
return 0;
}
header hd;
fread(&hd,10,1,file);
if(strncmp(hd.mark,"ID3",3)!=0)
{
cout << "This file hasn't TAG" << endl;
fclose(file);
return 0;
}
cout << "Version : "<< (int)hd.version[0]<<"."<<(int)hd.version[1] << endl;
cout << "Flags : "<< (int)hd.flags << endl;
cout << "size : " << usych(hd.size)<< endl;
if(hd.version[0] < 3)
{
cout<<"Version doesn't match"<< endl;
fclose(file);
return 0;
}
char buffer;
while(true)
{
frame fr;
fread(&fr,10,1,file);
if(fr.id[0]<'A')break;
cout << endl << fr.id[0] << fr.id[1] << fr.id[2] << fr.id[3];
cout <<" "<< usych(fr.size)<<" bytes... ";
if(fr.id[0]!='T'){
fseek(file,usych(fr.size),SEEK_CUR);
cout << "(Empty)" << endl;
}else{
cout << "(";
for(uint i=0;i<usych(fr.size);i++)
{
fread(&buffer,1,1,file);
if(buffer >= 32 && buffer <=126){
cout << buffer;
}
}
cout << ")" << endl;
}
}
cout << endl;
fclose(file);
return 0;
}