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 编译并生成静态库
- 安装
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
转载地址:https://blog.csdn.net/zzl819954692/article/details/80905906 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.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 之第 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 高并发服务限流第 5 篇 —— Hystrix 监控
2019-04-29
Eureka 如何快速的、优雅的停止某个微服务
2019-04-29
Eureka 实现安全认证
2019-04-29