找一首歌的长度

时间:2012-05-09 22:38:07

标签: c++ qt id3lib

我想在几秒钟内找到一首歌的长度,以便我可以制作一个M3U格式的播放列表,但我不知道如何从文件中获取该信息。我正在使用id3lib和Qt。

我试过了:

ID3_Frame* myFrame = myTag.Find(ID3FID_SONGLEN);
ID3_Frame* myFrame = myTag.Find(ID3FID_TIME);
ID3_Frame* myFrame = myTag.Find(ID3FID_SIZE);

但myFrame为NULL。我尝试了其他参数并且工作,如ID3FID_ALBUM。我真的不知道该尝试什么。我没有在id3lib API中找到任何内容。

我知道Qt可以给我这些信息,但我不能使用id3lib吗?

稍后编辑:我已经读过,MediaObject::totalTime()只给我时间,但是我想要那些信息,关于是否播放了歌曲;我需要这些信息才能将其写入文件中。

LATER EDIT:

我正在尝试使用Qt的Phonon,但我收到了很多错误。

#include <Phonon/MediaSource>
#include <Phonon/MediaObject>
#include <iostream>
#include <Qstring>

/* stuff */

Phonon::MediaObject *mediaObject = new Phonon::MediaObject();
QString fileName("D:/melodie.mp3");
mediaObject->setCurrentSource(fileName);
cout << mediaObject->totalTime() << endl;

我得到了很多未解决的外部符号

main.obj:-1:错误:LNK2019:未解析的外部符号“__declspec(dllimport)public:__ thiscall Phonon :: MediaObject :: MediaObject(class QObject *)”(_ imp ?? 0MediaObject @ Phonon @@ QAE @ PAVQObject @@@ Z)在函数_main中引用

我正在使用QCreator,我的应用程序很简单,只是一个打招呼的窗口(如果我不使用Phonon,它会起作用);我只是无法让它运行;我已经分配了静态mediaObject,我已经制作了一个MediaSource并尝试传递它,但它不起作用(这里说它不能从MediaSource *转换到MediaSource&amp;)。可能是什么问题?

3 个答案:

答案 0 :(得分:1)

您可以使用Phonon::MediaObject::totalTime()以毫秒为单位获取歌曲的长度。

id3lib不提供直接查找歌曲长度的功能,因为曲目长度不是ID3v1或ID3v2“标准”的一部分。它们仅用于标记。如果在尝试问题中的代码时得到0,则可能意味着尚未设置这些标记。如docs中所述,“如果找不到这样的帧,则Find()方法将返回NULL指针。”

答案 1 :(得分:1)

正确设置媒体源后使用MediaObject::totalTime

答案 2 :(得分:0)

我建议您使用totalTimeChanged(qint64 newTotalTime)信号。捕获轨道长度的方法比较谨慎,因为您无需手动检查mediaObject的状态。