嵌入式Linux平台下MPlayer图形用户界面的实现

2014-11-20 08:18张增虎
电视技术 2014年5期
关键词:图形用户界面开发板嵌入式

张增虎,李 博,郭 锐

(中北大学电子与计算机科学技术学院,山西太原030051)

随着信息技术的发展,嵌入式设备越来越多地走进人们的日常生活。MPlayer是一款可在各主流操作系统上使用的多媒体播放器,也支持嵌入式Linux平台。它是一款功能强大的多媒体播放器,支持所有主流的多媒体文件格式。美中不足的是,它的操作是基于命令行界面的,在嵌入式Linux平台下还没有一款图形用户界面,操作起来十分不方便。针对这个问题,决定为其开发一款基于Qt框架的图形用户界面[1-2]。Qt是一个跨平台的C++应用程序开发框架,广泛用于开发GUI程序。在基于S3C6410微处理器和嵌入式Linux操作系统的软硬件平台上设计和实现了一款GUI软件,该GUI软件可以实现对MPlayer常用的控制功能,基本满足了使用需要。本文即阐述了这款图形用户界面的设计和实现过程。

1 Qt编程相关技术

1.1 图形用户界面

Qt的图形用户界面的基础是QWidget。Qt中所有类型的GUI组件如按钮、标签、滑动条等都派生自QWidget,而QWidget本身则为QObject的子类。Widget负责接收鼠标、键盘、触摸屏和来自窗口系统的其他事件,并在屏幕上描绘了自身显示。每一个GUI组件都是一个Widget,Widget还可以作为容器,在其内包含其他Widget。

QWidget不是一个抽象类型,并且可以被放置在一个已存在的用户界面中。若是Widget没有指定父Widget,当它显示时就是一个独立的视窗或是一个顶层Widget。Qt提供一种托管机制,当Widget于创建时指定父对象,就可把自己的生命周期交给上层对象管理,当上层对象被释放时,自己也被释放,确保对象不再使用时都会被删除。

1.2 信号与槽

信号与槽机制[3]是Qt的核心机制,同时也是Qt特有的机制。Qt利用信号与槽(signals/slots)机制取代传统的callback来进行对象之间的沟通。当操作事件发生的时候,对象会发提交一个信号(signal);而槽(slot)则是一个函数接受特定信号并且运行槽本身设置的动作。信号与槽之间,则通过QObject的静态方法connect来链接。信号在任何运行点上皆可发射,甚至可以在槽里再发射另一个信号,信号与槽的链接不限定为一对一的链接,一个信号可以链接到多个槽或多个信号链接到同一个槽,甚至信号也可连接到信号。

1.3 布局管理

布局管理类型[4]用于描述一个应用程序的用户界面中的Widget是如何放置的。当视窗缩放时,布局管理器会自动调整Widget的大小、位置或是字号,确保它们相对的排列和用户界面整体仍然保有可用性。

Qt自带的布局管理类型有:QHBoxLayout、QVBoxLayout和QGridLayout。这些类型继承自QLayout,但QLayout非继承自QWidget而是直接源于QObject。它们负责Widget的几何管理。想要创建更复杂的布局管理,可以继承QLayout来自定义布局管理类型。

QHBoxLayout:配置Widget成横向一列;

QVBoxLayout:配置Widget成垂直一行;

QGridLayout:配置Widget在平面网格。

2 开发平台的搭建

本文的研究目的是设计实现一款嵌入式Linux平台[5-6]下的MPlayer图形用户界面,需要主机PC平台和嵌入式开发板平台。主机平台上安装的操作系统是Ubuntu 12.04,这是一款主流的GNU/Linux操作系统。开发软件为Qt Creator,它是Qt官方提供的一款轻量级的Qt/C++IDE开发环境。嵌入式开发板平台采用Arm-Linux体系结构,硬件平台以S3C6410处理器[2]为核心,操作系统版本为Linux-3.0.1。要想在嵌入式平台上运行Qt程序,必须将Qt库移植到嵌入式平台中。在Qt官网上下载Qt libraries源码包,按如下配置选项对Qt Libraries进行配置:

配置完成后进行编译,这样编译出来的就是Arm-Linux平台下支持触摸屏的Qt运行库。将编译完成后的Qt库放入嵌入式开发板的文件系统中,并将Qt的环境变量添加到系统环境变量中。至此,开发平台搭建成功。

3 图形用户界面的实现

GUI程序启动后显示主界面,主界面按功能分为两个部分:播放显示区和播放控制区,其中播放显示区占了屏幕的绝大部分。播放控制区内分布着时间显示标签、播放进度条、音量调节条和所有的播放控制按钮。主界面启动后,当按下按钮或拖动滑动条时,就会实现相应的功能。

3.1 主界面

主界面类mainWidget继承自QWidget,利用构造函数对类对象进行初始化。主界面的实现原理是在一个父Widget上添加按钮、标签、滑动条等部件作为子Widget。类mainWidget的构造函数部分代码如下:

mainWidget::mainWidget(QWidget*parent)

:QWidget(parent)

{

QWidget::setGeometry(QRect(0,0,800,480));

//设置主界面大小;

……

paceSlider=new QSlider(this);

//添加播放进度条;

paceSlider- > setGeometry(QRect(42,450,716,5));

//设置播放进度条的位置和大小;

paceSlider- >setOrientation(Qt::Horizontal);

//设置进度条为水平方向;

connect(paceSlider,SIGNAL(sliderReleased()),this,SLOT(pacesliderreleased()));

//关联进度条拖动释放信号和相应槽函数;

…...

playButton=new QPushButton("",this);

//新建开始按钮;playButton - > setGeometry(QRect(42,455,25,25));

//设置开始按钮的位置和大小;

playButton->setIcon(icon_play);

//设置开始按钮的图标;

connect(playButton,SIGNAL(clicked()),this,SLOT(play()));

//关联开始按钮按下信号和相应槽函数;

……

}

3.2 选择文件功能

播放开始前必须先选择播放文件。当还没有选择好播放文件时,按下开始按钮,会打开选择文件对话框。选择文件对话框继承自QDialog,对话框上的主要部件为播放文件列表、“添加”和“移除”按钮。点击“添加”按钮会进入文件目录选择文件,选中的文件会添加到播放文件列表中,点击“移除”按钮会移除播放列表中被选中的文件。双击播放列表中的一个文件或选中一个文件后按下对话框上的播放按钮,就会开始播放。选择文件对话框如图1所示。

图1 选择文件对话框示意图(截图)

3.3 播放文件功能

播放文件时,图形用户界面程序通过新建一个QProcess进程来调用作为后端的MPlayer进行播放。QProcess类可以启动一个外部程序并与之进行通信。MPlayer[7]启动后,QProcess进程通过标准输入输出与之进行通信交互。播放文件功能的实现代码为

QString program;//声明一个外部程序;

QStringList args;//声明程序的运行参数;

playProcess=new QProcess(this);

//新建一个QProcess进程来调用MPlayer;

program="/usr/local/mplayer/bin/mplayer";

//指定MPlayer程序路径;

args<<"-slave"<<"-quiet";

//使MPlayer运行于slave模式;

args<<"-x"<<"800"<<"-y"<<"450";

//指定MPlayer播放窗口的大小;

args< <"-vo"< <"fbdev";

//指定视频输出驱动为FrameBuffer;

args< <fileName;

//指定播放文件;

playProcess- >start(program,args);

//启动MPlayer开始播放;

在播放进行中,QProcess可以通过标准输入对MPlayer发出指令,也可以通过标准输出获取播放文件的信息。用户可以通过图形用户界面上的各个功能按钮实现暂停/播放、停止、快进(退)、上(下)一个、播放列表的显示(隐藏)和音量调节等功能。按钮控制的实现原理是信号与槽机制,点击按钮会触发此按钮的clicked()信号,clicked()信号被触发后,与之链接的槽函数会被执行,只要在槽函数中加入相应的功能代码,就会实现相应的控制功能。下面以快进功能为例,介绍按钮功能的实现方法。

在定义快进按钮的时候链接快进按钮的clicked()信号和快进功能槽函数forward():

connect(forwardButton,SIGNAL(clicked()),this,SLOT(forward()));

MPlayer快进10 s的命令为“seek 10 0”,要想实现快进10 s功能,就要在槽函数forward()中通过QProcess将这条命令发送给MPlayer。QProcess通过write()函数在标准输入发送命令。forward()函数源码如下:

void mainWidget::forward()

{

playProcess- >write("seek 10 0n");

}

3.4 显示时间功能

GUI程序不仅能通过QProcess向MPlayer写入命令,还能通过QProcess获取播放文件的媒体信息。在创建播放进程playProcess的同时,将playProcess的readyRead-StandardOutput()信号与槽函数dataRecieve()链接。play-Process进程通过标准输入向MPlayer发送获取媒体信息的命令,MPlayer接收命令后会将媒体信息返回到标准输出中,当标准输出中的数据信息可读时,会触发playProcess的readyReadStandardOutput()信号,与其关联的槽函数dataRecieve()会被执行。dataRecieve()读取标准输出中的数据信息后,经过转化显示在GUI界面上。利用这个原理可以实现当前播放时间和文件时间长度的显示。

获取文件时长的命令为“get_time_length”,当play-Process启动MPlayer以后,随即通过playProcess->write("get_time_lengthn")指令向MPlayer发送命令获取时长。MPlayer返回的时长信息以“ANS_LENGTH”开头,随后为以秒为单位的时间数据。槽函数dataRecieve()读取信息后会把以秒为单位的时间数据转化成“分:秒”的形式显示在GUI界面上。

当前时间的显示需要每秒更新1次。通过在MPlayer启动时建立1个QTimer类定时器,定时时间为1 s。每隔1 s定时器就会触发一次时间截止信号timeout(),与timeout()信号链接的槽函数timeok()会让playProcess发送一条获取当前时间的指令“get_time_pos”给MPlayer,返回的当前时间以“ANS_TIME_POSITION”开头。这样,dataRecieve()就能每隔1秒更新1次GUI界面上当前时间标签。

3.5 中文字体支持

首先将文泉驿字体wenquanyi_120_50.qpf放到开发板上Qt目录中的lib/fonts文件夹下,“120”表示是12号字体,“50”表示细体。有了字体文件后,就可以在GUI界面的主程序中选择使用中文字体,其实现代码为:

QApplication app(argc,argv);//声明程序

QFont font0;//声明一个字体font0

font.setFamily(("wenquanyi"));//设置font0字体家族为文泉驿

font.setPointSize(12);//设置font0字体字号为12

font.setBold(false);

app.setFont(font);//设置程序所用字体为font0

4 软件运行测试

全部程序编写完成以后,首先进行qmake让其自动生成Makefile文件,再进行make就生成了开发板上的可执行文件,将可执行文件和图标文件一起放到开发板的相应文件夹下。经过在开发板平台上的运行测试,结果表明,该图形用户界面在嵌入式Linux平台上能稳定运行,各项设计的功能都能实现且性能良好。运行测试效果图如图2所示。

图2 播放文件示意图(截图)

5 结束语

本文设计并实现了一款嵌入式Linux平台下的MPlayer图形用户界面,该图形用户界面基于Qt框架开发,利用了MPlayer的slave模式并通过QProcess进程控制MPlayer,实现了选择文件、播放控制等常用功能,成功地解决了MPlayer在嵌入式Linux平台下没有图形用户界面的问题,具有很高的实用性。经过测试,该界面程序运行稳定、操作良好,满足了设计要求。

[1]于帮伟,邓华秋.基于Qt/Embedded的嵌入式数字监控系统控制界面的实现[J].电视技术,2011,35(24):25-28.

[2]雷丰中,刘鹏.基于S3C6410的多媒体系统设计[J].电视技术,2011,35(11):24-27.

[3] Qt Project Group.Qt开发官方参考文档[EB/OL].[2013-05-25].http://qt-project.org/doc/qt-4.8/.

[4]蔡志明,卢传富,李立夏.精通Qt4编程[M].北京:电子工业出版社,2011.

[5]吴燕燕.基于ARM9平台上Qt/Embedded的移植与开发[J].液晶与显示,2013,28(2):261-264.

[6]闵华松,王娜,谭金鑫.嵌入式多媒体播放器通用控制系统设计与实现[J].计算机工程与科学,2009,31(2):153-155.

[7] MPlayer-电影播放器[EB/OL].[2013-05-25].http://www.mplayerhq.hu.

猜你喜欢
图形用户界面开发板嵌入式
Java图形用户界面编程在文本格式化设置系统中的教学研究
TS系列红外传感器在嵌入式控制系统中的应用
搭建基于Qt的嵌入式开发平台
浅谈图形用户界面的保护
浅析单片机开发板的设计与制作
嵌入式软PLC在电镀生产流程控制系统中的应用
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
sgRNAcas9软件图形用户界面开发及应用
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板