Mp3的文件头长10字节.主要保存ID3、ID3版本和副版本信息,以及Flag和帧长的信息。
Mp3尾部128字节大小的空间中包含了Header(尾部头,4字节),Title(歌曲名称,30字节),Artilst(艺术家30字节),Album(专辑,30字节),Year(发行年份,4字节),Comment(评论,30字节),Conre(?,1字节)
需要使用的函数 fseek() fread()
代码如下:
#include <stdio.h>
FILE *fp;
// Tag_header__Start
struct Tag_header{
char Header[3]; // It must be 'ID3'
char ver; // The version of ID3
char ReVer; // the subversion of ID3
char Flag;
char Size[4];
};
// Tag_header__End
// Tag_Trailer__Start
struct Tag_Trailer{
char Header[3];
char Title[30];
char Artist[30];
char Album[30];
char Year[4];
char Comment[30];
char Cenre[1];};
// Tag_GetTrailer__End
struct Tag_header Mp3Header;
struct Tag_Trailer Mp3Trailer;
main()
{
// 01.mp3是我测试时用的MP3的名称
fp = fopen("01.mp3","r+");
if(fp == NULL)
{
printf("No such file");
}
else
{
Tag_GetHeader();
Tag_GetTrailer();
}
printf("\n%s\n",Mp3Trailer.Title);
printf("%s\n",Mp3Trailer.Artist);
printf("%s\n",Mp3Trailer.Album);
printf("%s\n",Mp3Trailer.Year);
printf("%s\n",Mp3Trailer.Comment);
fclose(fp);
}
void Tag_GetTrailer()
{
// Get Header
fseek(fp,-128,SEEK_END);
fread(Mp3Trailer.Header,3,1,fp);
// Get Title
fseek(fp,-125,SEEK_END);
fread(Mp3Trailer.Title,30,1,fp);
// Get Artist
fseek(fp,-95,SEEK_END);
fread(Mp3Trailer.Artist,30,1,fp);
// Get Album
fseek(fp,-65,SEEK_END);
fread(Mp3Trailer.Album,30,1,fp);
// Get Year
fseek(fp,-35,SEEK_END);
fread(Mp3Trailer.Year,4,1,fp);
// Get Comment
fseek(fp,-31,SEEK_END);
fread(Mp3Trailer.Comment,30,1,fp);
// Get Cenre
fseek(fp,-1,SEEK_END);
fread(Mp3Trailer.Cenre,1,1,fp);
}
void Tag_GetHeader()
{
// Get ID3 Tag
fseek(fp,0,SEEK_SET);
fread(Mp3Header.Header,sizeof(Mp3Header.Header),1,fp);
// Get ID3 Version
fseek(fp,3,SEEK_CUR);
fread(Mp3Header.ver,sizeof(Mp3Header.ver),1,fp);
// Get ID3 Revision
fseek(fp,4,SEEK_CUR);
fread(Mp3Header.ReVer,sizeof(Mp3Header.ReVer),1,fp);
// Get ID3 Flag
fseek(fp,5,SEEK_CUR);
fread(Mp3Header.Flag,sizeof(Mp3Header.Flag),1,fp);
// Get ID3 Size
fseek(fp,6,SEEK_CUR);
fread(Mp3Header.Size,sizeof(Mp3Header.Size),1,fp);
}