liunx + QT + mplayer获得歌曲的播放时间和歌曲名等信息

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          //获得当前播放文件的“年份”

发布了19 篇原创文章 · 获赞 47 · 访问量 2641

猜你喜欢

转载自blog.csdn.net/papership/article/details/100100477
今日推荐