最近項目須要, 要獲取音樂文件tag信息. 有兩個方式, 本人偏向第二種方式. 效率比較高,可控性比較好.git
使用QML Audio component 進行解析. 將多媒體文件都放到Playlist中, 在遍歷每個文件取出文件中的tag.github
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(); } }
這個沒什麼好說的, 直接將tablib編譯成和一平臺同樣的類型就能夠了.例如: arm. x86.app
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 tabliboop