C++读取音频文件mp3、flac的曲名、歌手、专辑等ID3v2标签 (libzplay)

C++读取音频文件mp3、flac的曲名、歌手、专辑等ID3v2标签 (libzplay)

原文地址:https://blog.csdn.net/weixin_44629023/article/details/102534499

for Qt: https://blog.csdn.net/qq_27175513/article/details/80260586

试着自己写:https://blog.csdn.net/weixin_37608233/article/details/82930956

音乐的标签信息,以前用ID3v1来储存,直接存放文件最后128字节里,每一个属性的空间是固定大小的。现在的ID3v2则把标签存放在文件开头,每一属性的大小不固定;所以音频文件可以存下封面图片、歌词……这些容量大的东西。因此,程序读写v2标签变得很麻烦。

libzplay这个体积不大但功能强大的window音频类库,支持mp3、flac、wav等多种音频格式;而且非常简洁,几行代码就能调用它读取v2的标签信息。(v1不知道能不能读,我没找到还在用v1存标签的歌,2333)

libzplay官方下载地址https://sourceforge.net/projects/libzplay/files/2.02/libzplay-2.02-sdk.7z/download,里面有库文件和不同语言的例程。

我是直接把libzplay.dll、libzplay.h、libzplay.lib三个文件放在工程.cpp的同一文件夹下。若编译时vs报错error LNK2019: 无法解析的外部符号,则:项目属性→配置属性→链接器→输入→附加依赖项→添加libzplay.lib。

代码

#include "stdafx.h"
#include <stdio.h>
#include <string>
using namespace std;
#include "libzplay.h"
using namespace libZPlay;

int main()
{
    char *location = "Sea, You & Me.flac";//要读取的文件的地址。
    ZPlay* file = CreateZPlay();//创建类实例file
    if(file == 0)
    {
        printf("创建libzplay ID3类实例失败!\n");
        system("pause");
        return 0;
    }
    TID3InfoEx id3_info;
    if(file->LoadFileID3Ex(location, sfAutodetect, &id3_info, 1)) //加载file的ID3v2标签信息
    {
        printf("标题 Title:               %s\n", id3_info.Title);
        printf("参与创作的艺术家 Artist:  %s\n", id3_info.Artist);
        printf("唱片集 Album:             %s\n", id3_info.Album);
        printf("年 Year:                  %s\n\n", id3_info.Year);
        printf("备注 Comment:             %s\n\n", id3_info.Comment);
        printf("流派 Genre:               %s\n", id3_info.Genre);
        printf("#(编号) Track:          %s\n", id3_info.TrackNum);
        printf("唱片集艺术家 Artist1:     %s\n", id3_info.AlbumArtist );
        printf("作曲者 Composer:          %s\n", id3_info.Composer );
        printf("Original:                 %s\n", id3_info.OriginalArtist );
        printf("Copyright:                %s\n", id3_info.Copyright );
        printf("URL:                      %s\n", id3_info.URL );
        printf("编码人员 Encoder:         %s\n", id3_info.Encoder );
        printf("发布者 Publisher:         %s\n", id3_info.Publisher );
        printf("BPM:                      %u\n", id3_info.BPM);
        printf("封面图片类型 MIME:        %s\n", id3_info.Picture.MIMEType);
        printf("TYPE:                     %u\n", id3_info.Picture.PictureType);
        printf("Desc:                     %s\n", id3_info.Picture.Description);
        printf("文件大小:                 %u\n", id3_info.Picture.PictureDataSize);
        file->DrawBitmapToHWND(NULL, 0, 0, 0, 0, id3_info.Picture.hBitmap);//打印封面图片
    }
    else
        printf("无法加载文件ID3标签信息\n");
    system("pause");
}

有部分标签读不出来,不过最重要的 标题、艺术家、唱片集、编号 都没问题。

文章目录