macOS开发中用TagLib获取、修改音频文件信息
1.概述
TagLib是KDE开源项目的一个很有用的C++函数库,它可以用于读取各种格式的音频文件的ID3信息,如歌名、歌手、专辑、采样率等,同时也可以对以上部分的属性做出修改。
2.如何获取TagLib库
我们可在此处选择最新的或者适合自己的Taglib库,本文中使用最新的TagLib 1.11.1。
2.1下载后解压文件
下载完成点击解压文件,可得到taglib-1.11.1文件夹,由于是C++库,需要用cmake编译,下面介绍如何编译。
2.2 编译并生成静态库
- 安装
cmake,打开终端,输入brew install cmake稍等片刻即可安装成功。 - 校验安装成功,终端输入
which cmake,默认输出为/usr/local/bin/cmake表示安装cmake成功。 - 将终端路径移动到TagLib文件解压后的文件夹中,终端输入(注意cd到你自己的taglib目录下):
cd /Users/zhuzhanlong/Desktop/taglib-1.11.1
防止编译后文件过多,创建build文件夹:
mkdir build
进入到build文件夹:
cd build
开始编译(cmake 后‘..’表示CMakeLists.txt在上一级目录结构中):
cmake ..,执行成功后继续输入:
make,当进度为100%时,执行:
make install
到此,TagLib库的解析完成,我们可以看到,头文件放置在/usr/local/include中

2.3复制静态库及头文件到项目中
静态库文件libtag.a在前面生成的build路径下可以找到,拖入项目中:
,同时需要为本项目添加libz.tbd库,否则会报错。
头文件可以终端直接打开文件所在目录:
open /usr/local/include/
将taglib文件夹复制到项目中,删除对其中.tcc后缀的文件的引用,注意,是删除引用,不是删除文件!然后配置好头文件及library的搜索路径,如图所示:

3使用TagLib库
3.1导入头文件
#import "taglib.h"
#import "tag.h"
#import "fileref.h"
**注意:
- 根据head search path配置不同,上述引用的路径也不同,一定要核对正确!
- 此时会报错‘string’ file not found **,因为按照OC的编译方式导致找不到C++库中的头文件。解决办法:将引入头文件的类的.m文件后缀改为.mm即可。

3.2使用TagLib获取音频文件信息
在需要处理音频信息的地方调用以下部分程序,本例中在appdelegate.mm文件的init方法中调用如下代码:
//测试获取音频信息
NSString *aFile = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"];
TagLib::FileRef f([aFile UTF8String]);
TagLib::Tag *mytag=f.tag();
TagLib::AudioProperties *aproperties=f.audioProperties();
TagLib::uint length = aproperties->length();
TagLib::uint bitrate = aproperties->bitrate();
TagLib::uint sampleRate = aproperties->sampleRate();
TagLib::uint channels = aproperties->channels();
TagLib::String title = mytag->title();
TagLib::String author = mytag->artist();
TagLib::String album = mytag->album();
TagLib::String comment = mytag->comment();
TagLib::String genre = mytag->genre();
TagLib::uint year = mytag->year();
TagLib::uint track = mytag->track();
//将c++字符串转成oc字符串示例,后续均一致
NSString *nsTitle=[NSString stringWithCString:title.toCString(true)
encoding:NSUTF8StringEncoding];
NSLog(@"title:%@", nsTitle);
通过以上步骤,基本可得到音频文件的所有信息。下面对音频文件的信息作出修改。
3.3修改音频文件信息
同理,通过查阅API文档,可以看到获取属性和设置属性均可,基于上述获取信息部分,使用mytag设置音频信息,示例如下:
//修改音频信息
+ (void)editSongInfoWithPath:(NSString *)path model:(SongModel *)model {
TagLib::FileRef f([path UTF8String]);
TagLib::Tag *mytag=f.tag();
if (model.title.length > 0) {
mytag->setTitle(TagLib::String([model.title UTF8String], TagLib::String::UTF8));
}else {
mytag->setTitle(TagLib::String::null);
}
if (model.artist.length > 0) {
mytag->setArtist(TagLib::String([model.artist UTF8String], TagLib::String::UTF8));
}else {
mytag->setArtist(TagLib::String::null);
}
if (model.album.length > 0) {
mytag->setAlbum(TagLib::String([model.album UTF8String], TagLib::String::UTF8));
}else {
mytag->setAlbum(TagLib::String::null);
}
if (model.genre.length > 0) {
mytag->setGenre(TagLib::String([model.genre UTF8String], TagLib::String::UTF8));
}else {
mytag->setGenre(TagLib::String::null);
}
if (model.year.length > 0) {
mytag->setYear([model.year intValue]);
}else {
mytag->setYear(NULL);
}
if (model.comment.length > 0) {
mytag->setComment(TagLib::String([model.comment UTF8String], TagLib::String::UTF8));
}else {
mytag->setComment(TagLib::String::null);
}
f.save();//保存后才有效
}
可通过提示找到修改的变量信息,如图所示:

4.总结
进入公司一周有余,感觉同事都很厉害,感慨万千,想起了乔布斯那句肺腑之言,还有很多东西需要学习,加油!
Stay Hungry , Stay Foolish

本文介绍如何在macOS环境下利用TagLib库获取和修改音频文件的元数据,包括安装配置过程及示例代码。
1810

被折叠的 条评论
为什么被折叠?



