macOS开发中用TagLib获取、修改音频文件信息
发布日期:2021-06-29 11:52:49 浏览次数:3 分类:技术文章

本文共 3459 字,大约阅读时间需要 11 分钟。

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

转载地址:https://blog.csdn.net/zzl819954692/article/details/80905906 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:macOS开发之警告视图
下一篇:MacOS应用中调用NSTask执行终端命令(调用ffprobe命令获取音频详细信息)

发表评论

最新留言

很好
[***.229.124.182]2024年04月04日 02时07分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

垃圾分类背后的数据和真相 2019-04-29
PID算法搞不懂?看这篇文章就够了。 2019-04-29
这位电子工程师,你不能错过。 2019-04-29
十八般武艺教你如何解决问题 2019-04-29
「权威发布」2019年大学生电子设计竞赛,仪器设备和主要元器件清单 2019-04-29
「重磅猜题之第二篇」2019年大学生电子设计竞赛 2019-04-29
知乎:硬件和软件哪个吃香? 2019-04-29
中国深圳,600架无人机的盛典! 2019-04-29
干货分享 JVM 之第 3 篇 —— Java 内存结构相关 2019-04-29
干货分享 JVM 之第 4 篇 —— 掌握 Jmeter 压力测试工具,熟悉 Jconsole.exe 工具 2019-04-29
干货分享 JVM 之第 5 篇 —— 类加载器 2019-04-29
干货分享 JVM 之第 6 篇 —— SpringBoot2.0 框架性能调优 2019-04-29
基于 Hystrix 高并发服务限流第 1 篇 —— 必须了解的相关概念 2019-04-29
基于 Hystrix 高并发服务限流第 2 篇 —— 服务隔离(线程池隔离、信号量隔离) 2019-04-29
基于 Hystrix 高并发服务限流第 3 篇 —— 服务熔断、服务降级 2019-04-29
基于 Hystrix 高并发服务限流第 4 篇 —— 基于 Feign 实现服务熔断降级处理 2019-04-29
基于 Hystrix 高并发服务限流第 5 篇 —— Hystrix 监控 2019-04-29
Eureka 如何快速的、优雅的停止某个微服务 2019-04-29
Eureka 实现安全认证 2019-04-29
基于 Hystrix 高并发服务限流第 6 篇 —— 服务限流,基于 RateLimiter 实现 2019-04-29