65.9K
CodeProject 正在变化。 阅读更多。
Home

id3lib 库的包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (5投票s)

2013年8月30日

CPOL

5分钟阅读

viewsIcon

34945

downloadIcon

1426

这是 id3lib 库的(C++)包装器。它有助于在使用了 ID3 标记的媒体文件中获取和设置(读取和写入)id3 帧。

引言

由于 20 世纪 90 年代初人们越来越渴望通过互联网共享音频文件,将 PCM 编码成文件大小更小的格式变得非常流行。在文件中添加音轨和专辑信息也变得必要,在 20 世纪 90 年代中期到后期,一个团队发布了我们现在所知的 ID3

ID3 是一种元数据(包含艺术家、专辑、播放时长、专辑封面、音轨号、流派等信息),它以数据块的形式存储在媒体文件开头(ID3v2)或结尾(ID3v1)。

id3lib 是一个开源的、跨平台的软件开发库,用于读取、写入和操作 ID3v1ID3v2 标签。

编写此包装器是为了简化 id3lib 的使用。

设置您的开发环境

如果您已经知道如何设置开发环境以链接 id3lib,可以跳到本节的第二部分。

首先,获取本文附件中的 id3lib 压缩包(您也可以从 sourceforge.net/projects/id3lib/files/ 获取)。压缩包应包含一个名为 “id3” 的文件夹、一个名为 “id3.h” 的头文件、一个名为 “id3lib.dll” 的 dll 文件、一个名为 “id3lib.exp” 的导出库文件和一个名为 “id3lib.lib” 的对象文件库。解压压缩包。

  1. 在 Visual Studio 中,转到“项目”菜单,然后选择“属性页”(<您的项目名称> 属性页)。打开窗口后,转到“配置属性”选项卡,然后选择“链接器”部分。在“附加库目录”下,将您解压压缩包的路径作为值添加进去。
  2. 然后转到 c/c++ 选项卡,在“附加包含目录”下,也添加解压路径作为其值。
  3. 然后转到解压路径,将 id3lib.dll 文件复制到您项目的输出目录或您的 system32 文件夹。

您的环境已准备好使用 id3lib 库。id3lib.dll 需要与您的可执行文件一起打包。

其次,获取本文附件中的 tagHelper_dd_mm_yyyy.zip 压缩包,解压它,并将两个文件(tagHelper.htagHelper.cpp)复制到您的项目中。

将头文件 #include 到您的项目中。

#include "tagHelper.h" 

使用包装器

要使用包装器,您需要调用构造函数,并传入您要操作的媒体文件的文件名。

#include "tagHelper.h" 
int main()
{
tagHelper th("c:/started.mp3");
return 0;
}

读取值

可以使用包装器读取/获取各种值,从文件大小到 mp3 文件的 MPEGLayer,再到通道信息、标题、艺术家,甚至专辑封面。;-)

获取信息(不使用 getValue() 方法)

无需使用包装器的 getValue() 方法即可获取以下关于媒体文件的信息;hasLyrics(); hasV1Tag();hasV2Tag(); fileSize(); getMPEGLayer(); getMPEGVersion(); getMP3ChannelMode(); getCbrBitRate(); getVbrBitRate(); getFrequency(); getSampleRate(); getTrackLength();getMP3Header();

它们都是包装器的成员,它们的名称表明了它们的功能。

tagHelper th("c:/started.mp3");
MP3_BitRates cbr;
cbr = th.getCbrBitRate();
printf("The cbr bitrate is: %i\n", cbr);

Mp3_ChannelMode channel;
channel = th.getMP3ChannelMode();
printf("The channel mode is: %i\n", channel);

uint32 length;
length = th.getTrackLength();
printf("The track length is: %isec\n", length);

使用 getValue() 方法获取信息

包装器的 getValue() 方法可用于从媒体文件中获取额外的 id3 标签信息。getValue() 方法的原型是

char* tagHelper::getValue(ID3_FrameID); 

该方法返回存储在指定 ID3_FrameID 帧中的值,以字符数组的形式。ID3_FrameIDid3lib 包附带的 global.h 头文件中定义的常量。它们定义在第 231 行到第 326 行之间,并附有描述每个常量含义的说明。

如果指定的 ID3_FrameID 不存在于媒体文件中,getValue() 将返回 NULL

注意

  1. 并非所有的 ID3_FrameID 都可以与 getValue() 一起使用,因为并非所有的 ID3_FrameID 都将值“存储”为字符数组。仅将 getValue() 与那些接受字符数组的 ID3_FrameID 一起使用。
  2. 由编码器负责释放(deletegetValue() 返回的内存。
tagHelper th("c:/started.mp3");
//Getting the genre information of the song
char* genre;
genre = th.getValue(ID3FID_CONTENTTYPE);
printf("The genre is: %s\n", genre);
delete genre; //always remember to delete this

//Getting the title of the song
char* title;
title = th.getValue(ID3FID_TITLE);
printf("The title of the song is: %s\n", title);
delete title; //always remember to delete this

设置信息

setValue() 方法可用于创建和/或修改帧。其原型是

void tagHelper::setValue(ID3_FrameID, char*);

该方法接受 2 个参数;要更新的帧的 ID3_FrameID 和要更新的值。如果指定的帧不存在于媒体文件中,setValue() 将创建它并写入该值。

注意
  1. 并非所有的 ID3_FrameID 都可以与 setValue() 一起使用,因为并非所有的 ID3_FrameID 都将值“存储”为字符数组。仅将 setValue() 与那些接受字符数组的 ID3_FrameID 一起使用。
tagHelper th("c:/started.mp3");
//setting the year of the song
th.setValue(ID3FID_YEAR, "1986");

//setting the track number of the song
th.setValue(ID3FID_TRACKNUM, "02");

专辑封面

专辑封面 ID3FID_PICTURE 是您不能对它使用 getValue()setValue() 的帧之一,因为它的内容不是以字符数组形式存储的(这样说已经第三次了吧?)。

为您的媒体文件添加专辑封面

addAlbumart() 方法用于向媒体文件添加专辑封面。

void tagHelper::addAlbumart(char*);

该方法接受一个参数,即要设置为专辑封面的图像文件的路径。请注意,如果您指定的路径不存在,帧将不会被更新。这意味着,如果媒体文件之前包含专辑封面,它不会被删除。

tagHelper th("c:/started.mp3");

//Adding an albumart
th.addAlbumart("c:/albumart.jpg");

检索专辑封面

getAlbumart() 方法用于将媒体文件的专辑封面提取到图像文件中。这对于显示专辑封面的播放器来说非常有用。

bool tagHelper::getAlbumart(char*);

该方法接受一个参数;保存提取图像的位置。如果成功,它返回 true,如果失败,则返回 false

tagHelper th("c:/started.mp3");

//Extracting the albumart to c:/albumart_extracted.jpg
th.getAlbumart("c:/albumart_extracted.jpg");

移除标签(新增)

有时可能需要移除标签。这可能包括移除不需要的信息、移除个人信息,甚至完全移除(剥离)所有 id3 标签。

removeTag()

removeTag() 方法可用于从媒体文件中移除特定的 id3 标签。
bool tagHelper::removeTag(ID3_FrameID);
如果成功,此方法返回 true,如果标签不存在或操作失败,则返回 false
tagHelper th("c:/started.mp3");

//Removing the title tag
th.removeTag(ID3FID_TITLE);

//Removing the albumart
th.removeTag(ID3FID_PICTURE);

removeAllTags()

顾名思义,此方法会移除媒体文件中的所有 id3 标签。但请注意,它还会移除 Mp3_Headerinfo,因此在使用时要小心。

然而,在使用过 removeAllTags() 的媒体文件上使用 setValue() 方法后,Mp3_Headerinfo 的一部分(如果不是全部)似乎可以恢复。

这在将 mp3 文件解码为 wav 文件时非常有用。它解决了在尝试解码之前需要来回查找以移除文件 id3 部分的问题,只需对文件使用 removeAllTags() 然后进行解码即可!

tagHelper th("c:/started.mp3");

//Stripping all id3 tags
th.removeAllTags();

历史

2013 年 9 月 13 日
  1. 移除 getFrequency();,因为它与 getSampleRate(); 相同。
  2. 添加了标签移除功能(bool removeTag(ID3_FrameID);
  3. 添加了剥离所有 id3 标签的功能(bool removeAllTags();
2013 年 8 月 31 日 - 初始发布
© . All rights reserved.