id3lib 库的包装器






4.75/5 (5投票s)
这是 id3lib 库的(C++)包装器。它有助于在使用了 ID3 标记的媒体文件中获取和设置(读取和写入)id3 帧。
引言
由于 20 世纪 90 年代初人们越来越渴望通过互联网共享音频文件,将 PCM 编码成文件大小更小的格式变得非常流行。在文件中添加音轨和专辑信息也变得必要,在 20 世纪 90 年代中期到后期,一个团队发布了我们现在所知的 ID3
。
ID3
是一种元数据(包含艺术家、专辑、播放时长、专辑封面、音轨号、流派等信息),它以数据块的形式存储在媒体文件开头(ID3v2
)或结尾(ID3v1
)。
id3lib 是一个开源的、跨平台的软件开发库,用于读取、写入和操作 ID3v1
和 ID3v2
标签。
编写此包装器是为了简化 id3lib 的使用。
设置您的开发环境
如果您已经知道如何设置开发环境以链接 id3lib,可以跳到本节的第二部分。
首先,获取本文附件中的 id3lib 压缩包(您也可以从 sourceforge.net/projects/id3lib/files/ 获取)。压缩包应包含一个名为 “id3” 的文件夹、一个名为 “id3.h” 的头文件、一个名为 “id3lib.dll” 的 dll 文件、一个名为 “id3lib.exp” 的导出库文件和一个名为 “id3lib.lib” 的对象文件库。解压压缩包。
- 在 Visual Studio 中,转到“项目”菜单,然后选择“属性页”(<您的项目名称> 属性页)。打开窗口后,转到“配置属性”选项卡,然后选择“链接器”部分。在“附加库目录”下,将您解压压缩包的路径作为值添加进去。
- 然后转到 c/c++ 选项卡,在“附加包含目录”下,也添加解压路径作为其值。
- 然后转到解压路径,将 id3lib.dll 文件复制到您项目的输出目录或您的 system32 文件夹。
您的环境已准备好使用 id3lib 库。id3lib.dll 需要与您的可执行文件一起打包。
其次,获取本文附件中的 tagHelper_dd_mm_yyyy.zip 压缩包,解压它,并将两个文件(tagHelper.h 和 tagHelper.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_FrameID
是 id3lib
包附带的 global.h
头文件中定义的常量。它们定义在第 231 行到第 326 行之间,并附有描述每个常量含义的说明。
如果指定的 ID3_FrameID
不存在于媒体文件中,getValue()
将返回 NULL
。
注意
- 并非所有的
ID3_FrameID
都可以与getValue()
一起使用,因为并非所有的ID3_FrameID
都将值“存储”为字符数组。仅将getValue()
与那些接受字符数组的ID3_FrameID
一起使用。 - 由编码器负责释放(
delete
)getValue()
返回的内存。
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()
将创建它并写入该值。
- 并非所有的
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 日- 移除
getFrequency();
,因为它与getSampleRate();
相同。 - 添加了标签移除功能(
bool removeTag(ID3_FrameID);
) - 添加了剥离所有 id3 标签的功能(
bool removeAllTags();
)