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》(https://blog.csdn.net/papership/article/details/100100477)
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