您的位置:首页 > 其它

解析本地音乐文件

2018-03-08 08:55 309 查看
一首音乐的后128字节保留了信息,前3个字节用于识别是否是音乐,接着31个字节存储歌曲名,再接31个字节是歌手名,再接31个字节是唱片名,然后5个字节是年份,29个字节是注释,最后3个字节作为保留位。
所以用C语言代码如下#include<iostream>
using namespace std;
typedef struct _MP3INFO //MP3信息的结构
{
char Identify[3]; //TAG三个字母
//这里可以用来鉴别是不是文件信息内容
char Title[31]; //歌曲名,30个字节
char Artist[31]; //歌手名,30个字节
char Album[31]; //所属唱片,30个字节
char Year[5]; //年,4个字节
char Comment[29]; //注释,28个字节
unsigned char reserved; //保留位, 1个字节
unsigned char reserved2; //保留位,1个字节
unsigned char reserved3; //保留位,1个字节
} MP3INFO;
bool GetInfo(char *filePath)
{
// QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
FILE * fp;
unsigned char mp3tag[128] = { 0 };
MP3INFO mp3info;
fp = fopen(filePath, "rb");
if (NULL == fp)
{
cout << "打开文件失败" << endl;
return false;
}
fseek(fp, -128, SEEK_END);
fread(&mp3tag, 1, 128, fp);
if (!((mp3tag[0] == 'T' || mp3tag[0] == 't')
&& (mp3tag[1] == 'A' || mp3tag[1] == 'a')
&& (mp3tag[2] == 'G' || mp3tag[0] == 'g')))
{
fclose(fp);
cout<< "解析当前文件失败"<<endl;
return false;
}
//获取Mp3信息
memcpy((void *)mp3info.Identify, mp3tag, 3); //获得tag
memcpy((void *)mp3info.Title, mp3tag + 3, 30); //获得歌名
memcpy((void *)mp3info.Artist, mp3tag + 33, 30); //获得作者
memcpy((void *)mp3info.Album, mp3tag + 63, 30); //获得唱片名
memcpy((void *)mp3info.Year, mp3tag + 93, 4); //获得年
memcpy((void *)mp3info.Comment, mp3tag + 97, 28); //获得注释
memcpy((void *)&mp3info.reserved, mp3tag + 125, 1); //获得保留
memcpy((void *)&mp3info.reserved2, mp3tag + 126, 1);
memcpy((void *)&mp3info.reserved3, mp3tag + 127, 1);
fclose(fp);

cout << "Title:" << mp3info.Title << endl;
cout << "Artist:" << mp3info.Artist << endl;
cout << "Album:" << mp3info.Album << endl;
cout << "Year:" << mp3info.Year << endl;
cout << "Comment:" << mp3info.Comment << endl;
return true;
}
int main()
{
GetInfo("D:\\2.mp3");
system("pause");
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: