Получить метаданные из ID3v2 mp3-файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Решил попробовать разобрать mp3 файл, а именно, достать метаданные из ID3v2. Для начала, решил попробовать считать первые 10 байт (по спецификации: первые 3 байта - название ID3, затем 1 байт - старшая версия, 1 байт ревизия, 1 байт под флаги, 4 байта размер тэга).
#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;
}
проблема в том, что при выводе получаю вместо должного "ID3" – "ID3#", где # – посторонний символ....в что это может быть, или может я не правильно считываю первые 3 байта? Сразу хочу задать еще один вопрос, по спецификации – "Особенность указания длины данных ID3v2 в том, что в каждом байте 7-й бит не используется и всегда установлен в 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы