macOS开发中用TagLib获取、修改音频文件信息

macOS开发中用TagLib获取、修改音频文件信息

1.概述

TagLib是KDE开源项目的一个很有用的C++函数库,它可以用于读取各种格式的音频文件的ID3信息,如歌名、歌手、专辑、采样率等,同时也可以对以上部分的属性做出修改。

2.如何获取TagLib库

我们可在此处选择最新的或者适合自己的Taglib库,本文中使用最新的TagLib 1.11.1。

2.1下载后解压文件

下载完成点击解压文件,可得到taglib-1.11.1文件夹,由于是C++库,需要用cmake编译,下面介绍如何编译。

2.2 编译并生成静态库

  1. 安装cmake,打开终端,输入brew install cmake稍等片刻即可安装成功。
  2. 校验安装成功,终端输入which cmake,默认输出为/usr/local/bin/cmake表示安装cmake成功。
  3. 将终端路径移动到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
    解析TagLib完成

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"

**注意:

  1. 根据head search path配置不同,上述引用的路径也不同,一定要核对正确!
  2. 此时会报错‘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

发布了66 篇原创文章 · 获赞 32 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览