Получить метаданные из ID3v2 mp3-файла - C (СИ)
Формулировка задачи:
Здравствуйте! Решил попробовать разобрать mp3 файл, а именно, достать метаданные из ID3v2.
Для начала, решил попробовать считать первые 10 байт (по спецификации: первые 3 байта - название ID3, затем 1 байт - старшая версия, 1 байт ревизия, 1 байт под флаги, 4 байта размер тэга).
проблема в том, что при выводе получаю вместо должного "ID3" – "ID3#", где # – посторонний символ....в что это может быть, или может я не правильно считываю первые 3 байта?
Сразу хочу задать еще один вопрос, по спецификации – "Особенность указания длины данных ID3v2 в том, что в каждом байте 7-й бит не используется и всегда установлен в 0". Как нужно это учитывать?
Заранее спасибо!
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char tag[2];
char major;
char ver;
char flag;
int tag_size;
} id3v2;
int main()
{
id3v2 test;
FILE *file = fopen("zYJuxvA-90668.mp3","rb");
if(!file) {perror("zYJuxvA-90668.mp3"); exit(1);}
fread(&test,sizeof(id3v2),1,file);
printf("%s\n",test.tag);
return 0;
}Решение задачи: «Получить метаданные из ID3v2 mp3-файла»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define ID3_MAX_SIZE 128
typedef struct IDv3Tag
{
char signature[3];
char name[30];
char artist[30];
char album[30];
char year[4];
char description[30];
unsigned short ganre;
} ID3TAG;
long idv3_file_offset(FILE* fp)
{
fseek(fp, 0L, SEEK_END);
return ftell(fp) - ID3_MAX_SIZE;
}
int main()
{
FILE* fp = NULL;
const char* filename = "test.mp3";
if ((fp = fopen(filename,"r")) == NULL)
printf("Unable to open file %s for reading\n", filename);
char* buf = new char[ID3_MAX_SIZE];
memset((void*)buf, 0x00, ID3_MAX_SIZE);
fseek(fp, idv3_file_offset(fp), SEEK_SET);
fread(buf, 1, ID3_MAX_SIZE, fp);
ID3TAG* pId3Tag = NULL;
if ((pId3Tag = reinterpret_cast<ID3TAG*>(buf)) != NULL)
{
printf("Name: %s\n",pId3Tag->name);
printf("Artist: %s\n",pId3Tag->artist);
printf("Album: %s\n",pId3Tag->album);
printf("Year: %s\n",pId3Tag->year);
printf("Description: %s\n",pId3Tag->description);
printf("Ganre: %d\n",pId3Tag->ganre);
}
fclose(fp);
_getch();
return 0;
}