这篇承接上篇,主要记录的是代码,关于mp3ID3V2的简要介绍可以跳转到上一篇:
QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(一)
前提说明:没有使用任何的外部库,纯代码实现的,根据网上主流的c语言代码提取mp3id3v2标签信息,结合QT修改的
一、头文件
1.1、申明两个结构体,存放相关信息
#ifndef MP3TAGLIB_H
#define MP3TAGLIB_H
#include <QMainWindow>
#include "stdlib.h"
#include "stdio.h"
#include <QDebug>
#include <QImage>
#include <QMap>
#include <QTextCodec>
#include <QString>
#include <QFile>
#include <QUrl>
using namespace std;
class MP3Header;
typedef struct ID3V2FrameH
{
char frameID[4]; //存放标签格式,是否为id3v2
unsigned char size[4]; //存放标签数据的大小
char flags[2];
}ID3V2FH;
typedef struct MP3INFO
{
QString Url; //存放这首歌的详细地址
QString Name; //歌名 TIT2
QString Album; //专辑 TALB
QString Singer; //歌手 TPE1
QString Picture_url; //歌曲图片存放路径
QString Picture_type; //图片类型 jpg,png
int number; //歌曲编号
int beginNum; //图片起始位置
int lenth; //图片数据长度
bool pic_flag; //是否有图片
}MP3INFO;
typedef struct frameIDStruct
{
int beginNum;
int endNum;
QString FrameId;
}frameIDStruct;
1.2、MP3Header类
class MP3Header
{
public:
MP3Header();
FILE *fp;
QString m_url;
unsigned char Header[3];
unsigned char FrameId[4]; //存放帧标识
unsigned char Header_size[4];
unsigned int mp3_TagSize;
unsigned char frameSize[4]; //存放该帧内容的大小
unsigned int framecount; //计算出帧内容的大小
void GetMp3IDV2(const wchar_t *url);
MP3INFO GetAllInfo(const wchar_t *url, int songNumber);
void GetPicture(MP3INFO *mp3info);
void GetFrameId();
QString GetInfo(QString fId);
QMap<QString,frameIDStruct> m_IDmap;
};
#endif // MP3TAGLIB_H
二、源文件
这里只展示GetAllInfo函数的实现,所有的功能都在这个函数内实现了,其他函数是我做音乐播放器用到的,这里不重要
2.1、打开mp3文件,得到标签的类型
MP3INFO MP3Header::GetAllInfo(const wchar_t *url,int songNumber)
{
m_url = QString::fromWCharArray(url);
fp = _wfopen(url,L"rb");
if (NULL==fp)
{
printf("open read file error!!");
MP3INFO falseInfo;
falseInfo.pic_flag = false;
return falseInfo;
}
fseek(fp,0,SEEK_SET);
fread(&Header,1,3,fp);
if(Header[0]=='I'&&Header[1]=='D'&&Header[2]=='3')
{
qDebug()<<"open ID3 correct!";
}
说明:
由于歌曲名字有中文也有英文,因此使用wchar_t类型存储,wchar_t宽字符类型一般为16位或32位,在申明一个wchar_t类型的常量时可以使用一下语句:
QString filePath = "C:/Users/Admin/Desktop/song.mp3"
const wchar_t * url = reinterpret_cast<const wchar_t *>(filePath.utf16());
也可以:
const wchar_t *url = L"C:/Users/Admin/Desktop/song.mp3";
fp = _wfopen(url,L"rb"); 为c语言的文件读取函数,因为url是宽字节,所以要使用_wfopen而不使用fopen,关于这两个函数的有关内容,可以参考博文:
https://blog.csdn.net/zmq5411/article/details/21003831
if (NULL==fp)
{
printf("open read file error!!");
MP