QT 读取mp3ID3V2 获取mp3专辑图片、专辑名称、标题、作者(二)

这篇博客介绍了如何使用QT纯代码读取mp3ID3V2标签,获取mp3的专辑图片、专辑名称、标题和作者。详细讲解了打开mp3文件、解析标签头、读取帧数据的过程,特别是对于图片帧的处理和GBK编码转换。适合对QT编程和mp3元数据感兴趣的读者。
摘要由CSDN通过智能技术生成

 

这篇承接上篇,主要记录的是代码,关于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
  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值