QT利用mplayer取得音频文件播放的总时间、当前播放时间、播放百分比、专辑名、艺术家名、标题以及年份等信息。
原理:
利用QT的“QProcess”建立进程,通过QProcess的“start”方法,启动线程,调用“mplayer”命令播放音频文件,在mplayer的“slave”模式下,通过QProcess的write方法向进程中写入“mplayer”命令,发送需要取得的音频文件的数据,通过“readLine”方法,从进程中取得已经写入的播放文件相关信息。
实现步骤:
以取得当前播放时间和艺术家名(歌手名)为例进行说明,其他信息取得大同小异,请参考备注内容。
一、建立新进程,用来接收mplayer命令传递过来的文件信息
QProcess * mplayerProcess;
mplayerProcess = new QProcess(this);
mplayerProcess->setProcessChannelMode(QProcess::MergedChannels);
说明:
“setProcessChannelMode”的模式设置为“MergedChannels”,QT官网解释如下:
qprocess将正在运行的进程的输出合并到标准输出通道(stdout)中,标准错误通道(stderr)将不接收任何数据。
二、播放一个音频文件,并建立一个信号和槽函数
mplayerProcess->start("mplayer -slave -quiet /home/m_e1.mp3");
connect(mplayerProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(catchOutput()));
说明:
1、通过QProcess的“start”方法启动线程,调用“mplayer”命令播放音频文件“m_e1.mp3”,音频文件所在目录为“/home/m_e1.mp3”。
2、参数“-slave”表示使用slave模式,此时mplayer为后台运行其他程序,不再获取键盘事件,会从标准输入读取一个换行符(\n)来区分一个命令。
3、参数“-quiet”表示不要输出冗余信息。
4、通过connect建立信号(readyReadStandardOutput)和槽函数(catchOutput)的关联。
5、信号“readyReadStandardOutput”的作用如下:
当标准输出有数据输出的时候,就触发该信号,然后就可以调用槽函数“catchOutput”。
三、槽函数的实现
在槽函数catchOutput中做如下处理:
1、使用QProcess的write方法,往mplayer写入命令,发送需要取得的数据。
mplayerProcess->write("get_time_pos\n"); /* 发送当前播放时间 */
mplayerProcess->write("get_meta_artist\n"); /* 发送歌手名 */
注意:write中的参数不能缺少“\n”,否则不能接收到信息。
2、使用“canReadLine”取得需要的播放文件信息。
while (mplayerProcess->canReadLine()) {
QByteArray songInfo = mplayerProcess->readLine(); /* 取得一行数据 */
QString lineInfo(songInfo); /* 保存取得的一行数据 */
if (songInfo.startsWith("ANS_TIME_POSITION")) { /* 是否包含当前播放时间 */
QString currentStr = lineInfo.mid(18); /* 取得当前播放时间 */
ui->label->setText(currentStr);
}
else if(songInfo.startsWith("ANS_META_ARTIST")) {/* 判断接收到的数据是否包含艺术家 */
QString artist = lineInfo.mid(17); /* 取得艺术家 */
ui->label_2->setText(artist);
}
}
说明:
1、“canReadLine”当有数据从标准输出设备输出的时候,结果为“true”。
2、“readLine”方法一次能够取得一行数据,需要从这一行数据中提取出我们需要的信息。
3、通过“startsWith”方法确认取得的一行数据中是否包含我们需要的歌曲信息,例如“ANS_TIME_POSITION”可以判断是否包含当前播放时间。
4、需要的情报保存在变量“lineInfo”中,通过lineInfo.mid(18)方法可以取得,“mid(18)”表示从字符串的第18个字符开始取得数据,不同的信息取得字符的位置不同,究竟是何值可以通过设置断点,用debug的方式来查看并确认该值。
备注:
常用歌曲信息的发送命令如下:
get_time_pos //播放文件的当前时间,用秒表示,采用浮点数
get_percent_pos //当前播放文件的百分比(0--100)
get_time_length //播放文件的长度,以秒为单位
get_file_name //当前播放的“文件名”
get_meta_title //当前播放文件的“标题”
get_meta_artist //当前播放文件的“艺术家”
get_meta_album //当前播放文件的“专辑”
get_meta_genre //当前播放文件的“流派”
get_meta_comment //当前播放文件的“评论”
get_meta_year //当前播放文件的“年份”
常用歌曲信息的取得参数如下:
ANS_TIME_POSITION //获得播放文件的当前时间
ANS_PERCENT_POSITION //获得当前播放文件的百分比(0--100)
ANS_LENGTH //获得播放文件的长度,以秒为单位。
ANS_FILENAME //获得当前播放的“文件名”
ANS_META_TITLE //获得当前播放文件的“标题”
ANS_META_ARTIST //获得当前播放文件的“艺术家”
ANS_META_ALBU //获得当前播放文件的“专辑”
ANS_META_GENRE //获得当前播放文件的“流派”
ANS_META_COMMENT //获得当前播放文件的“评论”
ANS_META_YEAR //获得当前播放文件的“年份”