Mp3的文件头 长10字节.主要保存ID3、ID3版本和副版本信息,以及Flag和帧长的信息。
Mp3尾部 128字节大小的空间中包含了Header(尾部头,4字节),Title(歌曲名称,30字节),Artilst(艺术家30字节),Album(专辑,30字节),Year(发行年份,4字节),Comment(评论,30字节),Conre(?,1字节)
需要使用的函数 fseek() fread()
代码如下:
/*
Alias 2008-09-20
*/
#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);
}
|