Qt 导入TagLib库

文章目录

  • 0. 前言和环境介绍
  • 1. 下载`TagLib`
  • 2. 下载`zlib`
  • 3. 修改`.pro`文件
  • 4. 测试代码

0. 前言和环境介绍

最近在使用Qt写一个播放器,需要解析mp3文件,于是研究了一下如何导入TagLib

Qt构建套件:Desktop Qt6.8.2 MinGW64-bit
Qt Creator安装目录: D:\bit\QT\QtCreator
电脑版本: Windows11
CMake版本:cmake version 3.31.3

1. 下载TagLib

首先去taglib/taglib: TagLib Audio Meta-Data Library下载TagLib的压缩包,写此文章时TagLib已经更新到了2.0.2版本
image-20250320163409146

建一个build文件夹,进入该文件夹,输入如下的bash内容(不要输入注释),注意要给cmd管理员权限,而且各种mingw的各种编译器需要更改为你自己的Qt安装目录下的工具

# 指定使用mingw的编译器(防止使用MSVC),BUILD_SHARED_LIBS=OFF,确保CMake不生成动态库相关的导出符号。
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/gcc.exe" -DCMAKE_CXX_COMPILER="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/g++.exe" -DCMAKE_AR="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/ar.exe" -DCMAKE_RANLIB="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/ranlib.exe" -DBUILD_SHARED_LIBS=OFF ..
mingw32-make
mingw32-make install

接着看C:\Program Files (x86)下是否有taglib文件夹,(默认就是在这里生成的,如果不是,请仔细看cmake生成的日志),文件夹内容如下

image-20250320163934837

其中./include/taglib/存放的是.h文件,./lib/存放的是.a文件(注意,如果你使用的Qt套件是MSVC的,应该是.lib文件),下面两点需要注意

  • tag.libtag_c.lib是MSVC格式的静态库(.lib扩展名)
  • MinGW无法直接链接MSVC编译的库,必须使用MinGW编译的.a格式库

2. 下载zlib

taglib库需要使用该库,如果没安装请先把它安装,后面是地址,安装方式与前面一模一样
madler/zlib: A massively spiffy yet delicately unobtrusive compression library.

3. 修改.pro文件

创建一个基于Widget的项目,打开.pro文件,内容如下

QT += core gui widgets
CONFIG += c++17DEFINES += TAGLIB_STATIC  # 关键定义, 只使用静态库SOURCES += main.cpp widget.cpp
HEADERS += widget.h
FORMS += widget.uiINCLUDEPATH += "C:/Program Files (x86)/taglib/include"
LIBS += -L"C:/Program Files (x86)/taglib/lib" -ltag -ltag_cINCLUDEPATH += "C:/Program Files (x86)/zlib/include"
LIBS += -L"C:/Program Files (x86)/zlib/lib" -lz

导入完毕后重新构建一下项目

4. 测试代码

widget.cpp如下

#include "widget.h"
#include <QFileDialog>
#include <QUrl>
#include "taglib/fileref.h"
#include "taglib/tag.h"
#include "ui_widget.h"Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tag_lib_for_test();
}void Widget::tag_lib_for_test()
{auto            music_url = QFileDialog::getOpenFileUrl(this, "选择要上传的歌曲");std::wstring    wpath     = music_url.toLocalFile().toStdWString(); // 使用宽字符路径解决Windows中文路径问题TagLib::FileRef file(wpath.c_str());if (!file.isNull() && file.tag()) {TagLib::Tag*             tag        = file.tag();TagLib::AudioProperties* properties = file.audioProperties();QString                  title      = QString::fromStdWString(tag->title().toWString());QString                  artist     = QString::fromStdWString(tag->artist().toWString());QString                  album      = QString::fromStdWString(tag->album().toWString());QString                  year       = QString::number(tag->year());int                      duration   = properties->lengthInMilliseconds();qDebug() << "Title:" << title;qDebug() << "Artist:" << artist;qDebug() << "Album:" << album;qDebug() << "Year:" << year;qDebug() << "Duration:" << duration << "milliseconds";}
}Widget::~Widget()
{delete ui;
}

运行结果如下,当你选中某一个歌曲:

image-20250320165325015


PS:导入过程一波三折,我最开始使用Visual Studio来编译改库,生成的是.lib文件,结果当然是根本不能运行,后面换成.a还是不行,后来发现之前编译的zlib库还是.lib文件,于是又用mingw重新编译了一下。结果还是不行,当时真的崩溃了(╯‵□′)╯︵┻━┻,询问AI后发现需要指定使用mingw编译器,而且还需要加上BUILD_SHARED_LIBS=OFF这个选项,将两个库重新编译了一下,终于,报错没有了,程序跑起来了。一切都是mingw和msvc不兼容的原因,太折磨了,于是写这篇文章,避免以后踩坑。

参考文章:

  1. Qt使用Taglib库读取mp3文件标签信息_qt taglib-CSDN博客
  2. Windows中zlib的安装与配置_zlib windows-CSDN博客
  3. Qt调用第三方库的通用方式(静态链接库.a或.lib、动态链接库.dll)_qt引入第三方库-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39649.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端面试题】计算机网络相关

总结面试前端过程可能会问到的计算机网络相关知识点 1.HTTP和HTTPS的区别 &#xff08;1&#xff09;HTTPS HTTP 安全加密 HTTPS 是 HTTP 的 加密版&#xff0c;通过 SSL/TLS 保障数据安全&#xff0c;防止窃听和篡改。 &#xff08;2&#xff09;HTTPS 如何保护数据&…

【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、消息确认机制 消费者确认机制确保消息被正确处理后才从队列中删除。如果消费者处理失败&#xff08;如业务异常或宕机&#xff09;&#xff0c;Broker 会重新投递消息…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…

Python实现小红书app版爬虫

简介&#xff1a;由于数据需求的日益增大&#xff0c;小红书网页版已经不能满足我们日常工作的需求&#xff0c;为此&#xff0c;小编特地开发了小红书手机版算法&#xff0c;方便大家获取更多的数据&#xff0c;提升工作效率。 手机版接口主要包括&#xff1a;搜素&#xff0…

【AndroidRTC-11】如何理解webrtc的Source、TrackSink

Android-RTC系列软重启&#xff0c;改变以往细读源代码的方式 改为 带上实际问题分析代码。增加实用性&#xff0c;方便形成肌肉记忆。同时不分种类、不分难易程度&#xff0c;在线征集问题切入点。 问题1&#xff1a;如何理解VideoSource、VideoTrack&VideoSink三者的关系…

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio&#xff0c;但该工具占用空间大安装也较为麻烦&#xff0c;可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub&#xff1a;Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

英伟达黄仁勋谈人工智能趋势,首提代理式AI,后续机器人将登场

近日&#xff0c;英伟达 GTC 2025 大会主题演讲中&#xff0c;英伟达 CEO 黄仁勋再次身穿皮衣登场。黄仁勋一上来就提到了 AI 发展的未来&#xff0c;现在我们处于生成式 AI&#xff08;Generative AI&#xff09;阶段&#xff0c;但根据黄仁勋的路线图&#xff0c;我们将迈向一…

LCR 187. 破冰游戏(python3解法)

难度&#xff1a;简单 社团共有 num 位成员参与破冰游戏&#xff0c;编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target&#xff0c;从 0 号成员起开始计数&#xff0c;排在第 target 位的成员离开圆桌&#xff0c;且成员离开后从下一个成员开始计数…

水星(MERCURY)监控初始化的恢复和转码方法

水星(MERCURY)的安防监控恢复了很多&#xff0c;其嵌入式文件系统也一直迭代更新。做为数据恢复从业者每天处理最多的就是恢复数据&#xff0c;但是有的时候业务的需要我们不仅仅恢复出数据&#xff0c;还需要能够转码成通用的MP4类文件并要求画面和声音实现“同步”。 故障存…

基于SpringBoot的实现的客户关系管理系统(CRM)(源码+数据库)

464客户关系管理系统&#xff08;CRM&#xff09;&#xff0c;主要功能如下 【后台功能】 权限管理模块: 包括系统的登录与注册功能 用户管理模块: 基于RBAC的权限模型设计, 实现分配角色的功能功能 客户管理模块: 对客户信息进行新增 修改 删除 查看 联络信息管理模块: 对联络…

关于网络的一点知识(持续更新)

1、IP地址和子网掩码、端口号: IP地址是设备在网络上的地址,相当于一栋房子的门牌号。子网掩码相当于房子所在的街道。同一条街道的房子间是通过街道直通的,主人可以互相拜访。 举个例子,如下图所示。 说明:将两台设备的IP和子网掩码转化为二进制,然后将各自的IP地址和…

Python---数据分析(Pandas八:二维数组DataFrame数据操作一: 数据清洗,数据转换)

一、 数据清洗 1.1、 isnull() 用于检测 DataFrame 中的缺失值&#xff0c;它会返回一个相同形状的布尔型 DataFrame&#xff0c;其中每个元素表示原始 DataFrame 中相应位置的元素是否是缺失 值。 import pandas as pd import numpy as np# 创建一个包含缺失值的 DataFrame …

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…

Flask接口开发--GET接口

安装Flask 1.安装命令&#xff1a; pip3 install Flask2.查看Flask版本&#xff1a; pip3 show flask如图我的Flask版本号是2.0.3 项目创建 1、在PyCharm中&#xff0c;我们点击左上方的 file&#xff0c;选择 New Project&#xff0c;创建一个Flask项目。&#xff08;Py…

应用权限组列表

文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前&#xff0c;建议开发者先阅读应用权限管控概述-权限组和子权限&#xff0c;了解相关概念&#xff0c;再合…

Python为Word文档添加书签并打包成exe

背景简述 由于一些工作场景&#xff0c;需要从多个Word文档中找到出现的关键词&#xff0c;并阅读关键词的上下文内容。文件可能几十个&#xff0c;手动操作太要命了。所以python尝试处理。 目录 背景简述思路第一步、功能实现结果验证 第二步、打包成exe2-1、基础准备2-2、打…

【MYSQL】索引和事务

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容讲解 MySQL 中的索引和事务&#xff0c;在学习的过程中&#xff0c;我们需要经常问自己为什么 文章目录 1. 索…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…

PicGo安装与配置-Gitee图床

1、 前言 平时使用Typora写文章,上传文章到第三方平台上去都要把图片一个一个上传上去,于是我就百度了有没有什么方法可以省略这一步骤,我发现Typora可以用PicGo+Gitee图床方式,这个挺容易的,我把安装的过程在此记录下来。 PicGo是一个用于快速上传图片并获取图片 URL 链…

html css js网页制作成品——HTML+CSS+js迪奥口红网站网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…