Qt 使用tablib获取多媒体tag信息
最近项目需要, 要获取音乐文件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信息的更多相关文章
- Qt 获取usb设备信息 hacking
/************************************************************************** * Qt 获取usb设备信息 hacking * ...
- Python实例获取mp3文件的tag信息
下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- C# 获取 mp3文件信息
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- android中获取屏幕的信息
获取屏幕信息比较简单,可以通过android的sdk自带的工具类DisplayMetrics.话不多说,上代码: // 获取屏幕的信息 DisplayMetrics dm = new DisplayM ...
- android 获取系统硬件信息
一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ...
- AppUtils【获取手机的信息和应用版本号、安装apk】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...
- C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?
结帖率 60% 如题:目前在做一个项目,使用qt实现一个类似于机顶盒的遥控系统,那么关键的问题来了,如何让qt响应遥控器的按键信息呢? 应该分两步吧:1.搭载qt的终端接收来自遥控器的按键信息,并解析 ...
- Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比
Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比 上一篇文章: Android自动化测试中AccessibilityService获取控件信息(1 ...
随机推荐
- pixi.js 简单交互事件(点击、缩放、平移)
注意:本文代码使用的Pixi.js版本为PixiJS 5.3.3 pixi中常用的鼠标交互事件: //兼容鼠标和触摸屏的共同触发 type InteractionPointerEvents = &qu ...
- C#使用时间戳
前言 参考博客 C#获取和转换时间戳: https://blog.csdn.net/weixin_39885282/article/details/79462443 获取时间戳: https://ww ...
- H3C路由器配置示列一
说明: 如上图所示,192.168.0.0网段是总公司的网络,192.168.3.0和192.168.4.0网段是当前自己分公司的网络,且192.168.3.0是内网不能访问互联网,192.168.4 ...
- springboot实现mybaitis逆向工程
springboot实现mybaitis逆向工程 首先引入依赖,一共需要两个依赖(一个是mybaits依赖,一个是mybatis逆向工程插件) <dependency> <group ...
- CSS系列 (04):盒模型详解
盒模型 CSS盒模型分成W3C标准盒模型和IE模型 W3C标准盒模型(默认):box-sizing: content-box padding和border都会撑开盒子,改变盒子的宽度高度 总宽度:wi ...
- 一道java算法题
12个人围成一圈,序号依次从1至12,从序号1开始顺时针依次数,数到7的人退出,下一个再依次从1开始数,求留下来的最后一个人的原始序号. public static void joseph(int[] ...
- java Stream学习笔记
1.Stream与io无关. 2.Stream和用普通的循环没有太大区别,甚至时间复杂度更高,代码可读性差(通常代码行数更少). 3.流操作就是把循环要做的任务单独抽取出来,最终通过编译在一起. 来看 ...
- Github不为人知的一个功能,一个小彩蛋
Github 是一个基于Git的代码托管平台,相信很多人都用过,当然这些"很多人"中大部分都是程序员.当你在Github上创建仓库时(Github称项目为仓库),你会给这个仓库添加 ...
- idea中maven的安装与配置
说明:类似maven安装和配置的帖子在网上有很多,本人也有做过参照,但是有些帖子的步骤跳跃性比较大,故此,本人整理了一下,给大家做个参考. 一.下载安装 一般都是在官网进行下载 https://mav ...
- Map遍历的几种方式
代码示例 /** * @author liaowenhui * @date 2020/6/25 11:15 */ public class TestMap { public static void m ...