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

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

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

  1. php获取文件夹中的音乐文件_PHP获取音频文件信息的方法

    本篇文章主要介绍PHP获取音频文件信息的方法,感兴趣的朋友参考下,希望对大家有所帮助. 项目需求:现在有一个音频文件上传的功能,在上传后PHP需要获取这个音频文件的相关信息,例如:时长等,由于这个文件 ...

  2. 解决ffmpeg获取AAC音频文件duration不准

    最近测试提出了一个bug,ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是3m48s(准确时间是MMParserExtractor: ...

  3. weblogic下开发web项目时修改java文件不用重启的绿色方法,不用修改weblogic的配置文件、不用jar...

    2019独角兽企业重金招聘Python工程师标准>>> weblogic下开发web项目时修改java文件不用重启的绿色方法,不用修改weblogic的配置文件.不用jar      ...

  4. 用Python的mutagen模块获取MP3音频文件的时长

    工作中碰到的需求,今天下午虽然解决了,但是不太简洁(本质上还是用的mutagen...),回家查了查试了试,用mutagen可以很容易获取MP3音频文件的长度, 一共三行代码 from mutagen ...

  5. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

  6. kjb文件 解析_批量修改MP3文件信息

    前两天本人在整理自己的歌单时(题外话,本人是一个热衷音乐的程序员噢,哈哈),发现之前下载的很多MP3文件里的歌手,标题等信息对不上,很多都是错的.对于患有"强迫症"的本人来说,当然 ...

  7. ffmpeg学习(印对应的文件信息,抽取音频文件信息)

    目录 打印对应的文件信息 抽取音频文件信息 打印对应的文件信息 # 概念 多媒体文件是个容器,在容器中有很多流,使用(stream或者track)表示.每种不同的流不交叉,是由不同的编码器的编码的(音 ...

  8. php修改音频文件_php获取mp3文件信息时长修改

    function djinfo($dir) { if(!file_exists($dir)) return ''; if(substr(php_uname('s'),0,7)=="Windo ...

  9. ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的,一同事反应会随机出现ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是8.4秒(准确时间是MtkAACExtra ...

最新文章

  1. arduino下载库出错_【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用...
  2. SAP MM MIRO的时候,发票价格与物料主数据的价格(移动平均价)有差异的处理
  3. docker安装mysql并实现远程访问
  4. Elasticsearch配置使用
  5. 动态视频目标检测和跟踪技术(入门)
  6. Living in the Matrix with Bytecode Manipulation--转
  7. TIP 2019开源论文:基于深度学习的HEVC多帧环路滤波方法
  8. mysql优化 mysql.ini优化
  9. [众包]Eclipse 运行简单亚马逊AMT模板
  10. CIO,你想做一辈子“消防员”吗?
  11. 9008刷机工具_黔隆科技刷机教程OPPOR9S忘记密码免刷机保资料解屏幕锁教程
  12. USB 大容量存储设备的开发
  13. Android通过RecyclerView实现手风琴效果
  14. EPLAN小知识——如何在西门子(SIEMENS)官网下载EDZ部件
  15. centos7挂载ntfs文件系统_CentOS7挂载NTFS格式的硬盘
  16. 2021-11-05 springMVC 错误:org.springframework.http.converter.HttpMessageNotWritableException: No conve
  17. nginx: [warn] conflicting server name 这里是域名 eg:abc.com on 0.0.0.0:80, ignored解决方法
  18. oracle mysql 同义词,有关Oracle数据库中同义词的简单介绍
  19. 顺丰科技运维开发工程师二面面经
  20. 倍福PLC--C#实现ADS通信超时重传设定

热门文章

  1. 双鱼林php学生信息管理系统,双鱼林基于ThinkPHP5图书管理系统demo v1.0
  2. 虎年第一条微信,拜年啦
  3. 常见PCIE X1/X4/X8/X16插槽作用与区别
  4. 独家爆料!在美团搞安全,是种怎样的体验?
  5. 关于使用VMware Workstation Pro16 创建Kali-Linux虚拟环境的操作办法以及库源的配置
  6. 推荐10个免费实用的资源网站,值得收藏
  7. Android permission denied原因归纳和解决办法
  8. 【数据应用案例学习】(一)—— 基于用户画像的腾讯大数据防刷架构
  9. python动物专家系统_动物识别专家系统 实验报告
  10. 月薪5k与月薪15k程序员的区别