Получить метаданные из 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д