QML实现媒体播放器

Miette ·
更新时间:2024-11-10
· 858 次阅读

linux系统平台,使用QML结合mplayer实现媒体播放功能

一、实现功能:

音/视频播放和暂停,快进/快退,上一曲/下一曲,单曲循环,顺序播放,随机播放。

二、原理:

利用QML描画播放器的UI界面,使用mplayer技术实现音/视频播放。

三、实现方法/步骤:

1、在QML文件中描画各种按钮的位置及图片的显示区域。

2、用linux的“find”命令建立播放列表,生成名为“audio.lst”的文件,该文件保存指定路径下的所有.mp3文件,每一行保存一个mp3文件的全路径,在C++代码中实现。

3、建立SQLite数据库,将“audio.lst”文件中的mp3文件的全路径导入到数据库中。

4、创建一个进程,用来播放mp3,为了能够控制这个进程,需要建立QProcess类的指针mplayerProcess来指向一个进程,然后可以通过mplayerProcess向这个进程(也就是mplayer)发送相应的命令,来执行各种播放操作,代码如下:

QProcess  *mplayerProcess;

mplayerProcess = new QProcess(this);

mplayerProcess->setProcessChannelMode(QProcess::MergedChannels);

mplayerProcess->start("mplayer -slave -quiet /home/music.mp3");

5、可以给mplayer发送各种命令行,通知它完成各种操作,如:播放、暂停、换曲、静音等操作,详细请参考《mplayer详解.xlsx》

mplayerProcess->write(“pause\n”);         //暂停操作

mplayerProcess->write("get_meta_artist\n"); //取得艺术家的名字

mplayerProcess->write("mute 0\n");          //静音关闭(出声音)

mplayerProcess->write("mute 1\n");          //静音(不出声)

6、通过定周期处理机制,实现播放功能的数据更新。

例如歌曲的当前播放时间,每隔1秒需要更新,我们就可以设置一个200毫秒的定周期函数来实现,每隔200毫秒发送一次当前播放时间的数据。代码如下:

Time200 = new QTimer(this);

Time200->start(200);

connect(time200, SIGNAL(timeout()), this, SLOT(update200ms())); 

void update200ms()

{

    mplayerProcess->write("get_time_pos\n");      /* 发送当前播放时间 */

}

以上利用QTimer建立一个200毫秒的定周期信号,然后建立一个信号和槽函数的连接,每隔200毫秒,槽函数update200ms()都会被调用一次,在槽函数中给mplayer发送“get_time_pos”,更新当前的播放时间。

注意:

关于定周期时间的选择,需要根据具体情况合理设计,为什么没有选择1秒,是因为数据发送的过程中,可能出现不能被mplayer接收的情况,这样的话就会出现每隔2秒才能更新一次时间;为什么不能选择50毫秒或者更少的时间,这样的话,数据发送过于平凡,会影响系统的效率。

四、知识点:

1、利用linux的find命令建立播放列表:

find /home/ -name \"*.mp3\" > /home/audio.lst

2、“.lst”和“.txt”文件一样,属于文本文件。

3、“system”函数:执行括号里的字符串命令,可以将需要执行的linux命令放到函数的参数中,就可以执行该命令。

原型:system(const char * string)

例如:system(“ls”)就相当于执行linux的“ls”命令。

五、实现后的效果图

 

六、参考资料:

http://www.mplayerhq.hu/design7/news.html


作者:papership



qml

需要 登录 后方可回复, 如果你还没有账号请 注册新账号