最近项目需要, 要获取音乐文件tag信息. 有两个方式, 本人偏向第二种方式. 效率比较高,可控性比较好.

一.QML方式

使用QML Audio component 进行解析. 将多媒体文件都放到Playlist中, 在遍历每一个文件取出文件中的tag.

import QtQuick 2.7
import QtQuick.Controls 2.4
import QtMultimedia 5.8 Item {
property alias playList: parseMultimedia.playlist
property alias musicPlayer: musicPlayer WorkerScript {
id: worker
property bool running: false
property var type
source: "dataloader.js"
onMessage: {
if (messageObject.action === 'sortArtist') {
var msg = {'action': 'sortAlbum', 'model': songsListModel,
'dest': albumListModel};
worker.sendMessage(msg);
}
}
} Audio {
id: musicPlayer
autoPlay: true
autoLoad: true
onSourceChanged: {
}
playlist: Playlist {
id: musicPlayList
}
} Audio {
id: parseMultimedia
property var fileName
//autoPlay :true
autoLoad: true
muted: true
loops: Audio.Infinite
playlist: parsePlaylist
} Playlist {
id: parsePlaylist
} Timer {
id: insertTimer
property int indexPath: 0
interval: 200;
running: false; repeat: true
onTriggered: {
if ( indexPath < musicManager.count()) {
parseMultimedia.play()
parseMultimedia.pause()
var title = parseMultimedia.metaData.title var artist = parseMultimedia.metaData.albumArtist
if (artist === undefined) {
artist = 'unknown'
} var album = parseMultimedia.metaData.albumTitle
if (album === undefined) {
album = 'unknown'
} var source = Qt.resolvedUrl(parseMultimedia.playlist.itemSource(indexPath))
var fileName = musicManager.getFileInfoName(indexPath)
if (title === undefined) {
title = fileName
}
songsListModel.set(parsePlaylist.currentIndex, {"playlistIndex": parsePlaylist.currentIndex,
"title": parseMultimedia.metaData.title,
"album": album,
"artist": artist,
"source": source,
"fileName": fileName });
indexPath = indexPath + 1
parsePlaylist.next()
// listView.forceLayout(); } else {
if (indexPath >= musicManager.count() ) {
insertTimer.stop()
insertTimer.indexPath = 0
appWindow.isReady = true
allSongListModelReady();
}
}
} onRunningChanged: {
if (!running) {
var msg = {'action': 'sortArtist', 'model': songsListModel,
'dest':artistListModel};
worker.sendMessage(msg);
}
}
} Timer {
id: loadModelTimer
property int indexPath: 0
running: false; repeat: false
onTriggered: {
parsePlaylist.currentIndex = 0
insertTimer.start()
}
} Connections {
target: musicManager
onLoadfinish: {
parsePlaylist.clear() loadModelTimer.interval = musicManager.count()
loadModelTimer.start()
for (var i = 0; i< musicManager.count(); i++) {
parsePlaylist.addItem("file://" + musicManager.getFileInfoPath(i))
}
loadFolderData();
}
} function loadFolderData() {
for (var i = 0; i < musicManager.folderCount(); i++) { var item = musicManager.folderItem(i);
folderListModel.set(i, {"baseName": item.baseName,
"uid": item.uId ,
"dropTarget": "none",
"isFolder": item.isFolder,
"parentFolder": item.parentFolder,
"folderOpen":item.folderOpen,
"source": item.path,
"fileCount": item.fileCount })
}
}
Component.onCompleted: {
musicManager.runParse();
}
}

二.C++ tablib 方式

这个没什么好说的, 直接将tablib编译成和一平台一样的类型就可以了.例如: arm. x86.

int main(int argc, char **argv)
{
QString sname;
QString singer;
QString album;
QFileInfo fileInfo(QString("/sdcard/Music/Alone.mp3"));
qDebug() << fileInfo.absoluteFilePath(); const char *fileName = "/sdcard/Music/Alone.mp3";
TagLib::MPEG::File *mpegFile = new TagLib::MPEG::File(fileName);
qDebug() << "mpegFile: " << mpegFile;
if(false == mpegFile->isOpen()) {
qDebug() << "-----open failed---";
} else {
sname = QString(mpegFile->tag()->title().toCString(true));
singer = QString(mpegFile->tag()->artist().toCString(true));
album = QString(mpegFile->tag()->album().toCString(true));
qDebug() << sname;
qDebug() << singer;
qDebug() << album;
}
}

这里有我自己编译QT 项目.

QT tablib

Qt 使用tablib获取多媒体tag信息的更多相关文章

  1. Qt 获取usb设备信息 hacking

    /************************************************************************** * Qt 获取usb设备信息 hacking * ...

  2. Python实例获取mp3文件的tag信息

    下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  3. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  4. android中获取屏幕的信息

    获取屏幕信息比较简单,可以通过android的sdk自带的工具类DisplayMetrics.话不多说,上代码: // 获取屏幕的信息 DisplayMetrics dm = new DisplayM ...

  5. android 获取系统硬件信息

    一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" />  ...

  6. AppUtils【获取手机的信息和应用版本号、安装apk】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...

  7. C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  8. qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?

    结帖率 60% 如题:目前在做一个项目,使用qt实现一个类似于机顶盒的遥控系统,那么关键的问题来了,如何让qt响应遥控器的按键信息呢? 应该分两步吧:1.搭载qt的终端接收来自遥控器的按键信息,并解析 ...

  9. Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比

    Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比   上一篇文章: Android自动化测试中AccessibilityService获取控件信息(1 ...

随机推荐

  1. C# 托管与非托管类型 堆和栈 值类型与引用类型 装箱与拆箱

    一.托管类型与非托管类型 1.托管类型 托管类型包括 引用类型 以及 包含有引用类型或托管类型成员的结构. 引用类型 含引用类型或托管类型成员(字段.自动实现 get 访问器的属性)的结构 // 托管 ...

  2. Excel 快速跳到表格最后一行/第一行

    快速跳到表格的最后一行 首先鼠标选中一个带有数据的单元格,点击shift键,把鼠标放到该单元格底部的边缘地带,出现带四个方向的箭头为止,再连续点击鼠标左键两次,直接跳到表格的最后一行 快速跳到表格的最 ...

  3. Django中关于“CSRF verification failed. Request aborted”的问题

    遇到该问题的情境 在Django中采用Ajax提交表单,涉及到跨域问题. 解决措施 在html页面中的表单内添加如下代码: {% csrf_token %} 在视图函数所在的py文件中添加如下代码: ...

  4. (三)、vim的移动(旋转,跳跃)

    一.以word为单位的移动 1.w 向后移动到后一个单词词头,取自"word" This is a line with example text ----->--->- ...

  5. MethodHandleVS反射

    Method Handle与反射 如无特殊说明,本文所有代码均基于JDK1.8.0_221 Method Handle入门 反射我们都知道,为我们提供了运行时对类的成员方法访问的手段,极大地提高了Ja ...

  6. 使用Python实现搜索任意电影资源的磁力链接

    对于喜欢电影的人来说各种电影资源必不可少,但每次自己搜索都比较麻烦,索性用python自己写一个自动搜索的脚本. 这里我只分享我的思路,具体如何实现参考代码,要想实现搜索功能先要抓包分析如何发送数据, ...

  7. 手写简易版RPC框架基于Socket

    什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...

  8. ESP8266-01烧录神器,ESP8266-01S烧录程序 ESP-01烧录固件

    如下图所示:"USB转ESP8266",在某宝上可以买到,但是建议买两个! 为什么要买两个呢?一个用于测试AT指令.接电呀什么的.另外一个通过焊接就可以改造成烧录器了. 引脚说明: ...

  9. Java学习日报7.12

    public class HelloWorld{ public static void main(String[] args) { System.out.println("Hello Wro ...

  10. Pytest测试框架(一):pytest安装及用例执行

    PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest  ...