焦正才,樊文侠
(西安工业大学 陕西 西安 710032)
随着计算机技术和网络技术的飞速发展,嵌入式系统的广泛应用,PDA、掌上设备、WAP手机以及DVD/EVD播放机等嵌入式设备的迅速普及,而这些设备同时拥有华丽美观、易于操作的图形用户界面。MP3作为高质量的音乐压缩标准,数据压缩比率大,较小的数据量以及质量高的播放效果[1]。研究开发一款功能强大、界面友好、操作简单的MP3播放器,普通用户可以通过它在多姿多彩的多媒体世界中畅游,来满足自己的视听享受的要求,这些使得嵌入式媒体播放器成为了一个新的研究热点。近年来,在完全遵循GPL(通用公共许可证)条款下,产生的Qt/Embedded,使得许多嵌入式开发者转到了Qt/Embedded。因Qt使用“一次编写,随处编译”的方式为开发跨平台的图形用户界面应用程序提供了一个完整的C++应用程序开发框架。
Qt是Trolltech(奇趣)公司的标志性产品,是用于创建Linux下的图行软件中最出色的软件包之一。它是众所周知的桌面环境KDE所使用的工具包。Qt不仅适用于UNIX/Linux,而且还可以用于Windows。Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的应用接口程序函数(API)和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它还支持JavaTM和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面系统操作系统和嵌入式设备上的软件应用程序。针对范围广泛的各行各业,包括GoogleTM、Adobe@Lucasfilm和 SkypeTM,通过在Qt一个平台上的软件投资开发而涵盖其它众多平台,Qt可以缩短投入市场的时间并且提高生产效率[2]。
1)针对多个平台只编写一次代码;
2)独特的开发方式;
3)易学易用的模块化的类库;
4)在单一应用程序中可混合网络和本地代码。
Windows下开发环境的搭建:安装Qt SDK即可,它是一个完整的Qt开发环境,包括特定版本的Qt库和集成开发环境-Qt Creator IDE。
1)QObject类是所有能够处理 signal、slot和事件的 Qt对象的基类。
2)QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件和处理应用程序的开始、结束以及会话管理的功能。对于一个应用程序来说,建立此类的对象是必不可少的。其中,QApplication是QObject类的子类。
3)QWidget类是所有用户接口对象(组件)的基类,它是用户界面的单元组成部分,它接收鼠标、键盘和其他从窗口系统来的事件,并把它自己绘制在屏幕上。
信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为元对象编译器moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码[4]。其中,信号会在某个特定情况或是动作下被触发,槽是等同于接收并处理信号的函数。如图1所示。
图 1 Qt中 signal(信号)与 slot(槽)机制Fig.1 Signal and slot of Qt
图2 Qt图形用户界面开发流程图Fig.2 Graphical user interface development flow chart of Qt
文中基于Qt/Embedded设计的图形用户界面,利用FFmpeg解码库,它是一个高精度的开源MPEG音频解码库,其输出为24 bit。通过使用FFmpeg解码库对MP3文件进行解码,可以取得较好的播放效果,同时使用其提供的应用接口程序函数,可以实现对音频数据的解码和顺序视听。笔者采取模块化的设计模式,来实现用户视听MP3的基本功能。
MP3音乐播放器主窗口,它是播放器的控制窗口,完成与用户的人机交互。设计的MP3播放器控制界面如图3所示,其主要功能是完成对MP3歌曲播放的管理,诸如打开文件、歌曲列表、显示歌曲总时间、歌词的显示和歌曲播放进度、歌名、播放和暂停、上下曲和音量的增减进度条。下面对主要的功能模块进行介绍。
图3 MP3 Player界面Fig.3 Interface of MP3 Player
Qt中的QFileDialog标准文件对话框类,用户通过这些函数可以很方便地定制自己的文件对话框。其函数形式如下:
在Windows和Mac OS X下,这个静态函数将使用本地文件对话框而不是QFileDialog,除非应用程序的风格被设置为本地风格以外的某种风格。可以通过调用集成这个类,其中的getOpenName()函数,完成对MP3歌曲文件的选择。
目前在Qt 4.6中实现多媒体播放图形界面主要依赖于phonon框架,提供一套多媒体框架,提供多媒体回放的功能。其实QT中还有一个Multimedia模块,实现底层的多媒体播放功能,为使用音频和视频的应用程序开发提供的一个框架。开发人员可以大概了解多媒体播放是通过什么实现的,只需调用相应的接口就行,但这中间需要一个中转,被称为backend。Qt phonon多媒体文件的播放主要过程包括:文件读取、分流、解码、输出。如图4所示。
MP3文件格式是由一系列的帧组成的,帧是MP3文件的最小单位。如表1[5-6]所示。
计算MP3歌曲的时间,首先要读取MP3歌曲的数据流,而在MP3文件帧头的第二个字节里保存着MP3版本和Layer信息;第三个字节保存了比特率信息,通过查表可以获取帧头中的比特率,然后计算MP3的时间[3]。MP3的波特率rate与播放时间time符合公式(1):
图4 Qt phonon多媒体框架Fig.4 Multimedia framework of Qt phonon
表1 MP3文件结构和功能描述Tab.1 MP3 files structure and function description
在用户浏览网页和处理相关信息时,本设计的MP3播放器为用户量身定做了一个小的字幕歌词滚动条。可能有的开发者会有疑问,客户既然在做其他的事情,注意力肯定不在音乐上,歌词的显示有必要吗?答案是肯定的,我想很多人都用这种情况:看网页听歌的时候突然想看看刚才没听清楚的歌词是什么,在这个时候,歌词的显示展示出了它最大的魅力。
相关程序段如下:
同时也考虑了一些特殊情况,如若0.1 s不显示歌词,则显示“Music...
其中最重要的一点就是时间与歌词的更新显示,相关程序段如下:
文中基于Qt/Embedded设计的MP3应用播放器,目前已经实现,能够在Windows操作平台上运行正常,实现了基本的打开歌曲、歌曲切换、暂停、歌曲列表、歌词和时间进度条的功能。此播放器是在Windows操作系统下的QT集成环境下完成的,只要将此播放器的代码在其他QT能够运行的平台上重新编译就可以实现在当前平台上运行,真正做到了“一次编写,处处编译“的目的。Qt/Embedded使用了Qt在桌面上的所有功能,丰富的接口应用程序函数和基于组件的模块化编程思想,将会使Qt/Embedded成为未来嵌入式的主流GUI。
[1]王灵芝,陈雷松.基于嵌入式Linux与Qt的MP3播放器的设计[J].漳州师范学院学报:自然科学版,2009(1):39-43.
WANG Ling-zhi,CHENG Lei-song.Design of MP3 player based on embedded Linux and Qt[J].Zhang zhou Teachers College:Natural Science Edition,2009(1):39-43
[2]博创科技.嵌入式系统试验指导书[M].北京:北京博创兴业科技有限公司,2006.
[3]汪勇,熊前兴.MP3文件格式解析[J].计算机应用软件,2004(12):126-128.
WANG Yong,XIONG Qian-xing.MP3 file format parsing[J].Computer Application Software,2004(12):126-128.
[4]芦东昕,周建彬,谭振华.基于Qt/Embedded的控件扩展研究与实现[J].计算机技术与发展,2006(10):97-100.
LU Dong-xin,ZHOU Jian-bin,TAN Zhen-hua.Reseacher&implementation of extended widgets based on Qt/Emdedded[J].Computer Technology and Development,2006(10):97-100.
[5]王森林,庄圣贤.基于嵌入式Linux的MP3播放器设计[J].重庆工学院学报,2007(3):65-68.
WANG Sen-lin,ZHUANG Shen-xian.Design of MP3 player on embedded Linux[J].Chongqing Institute of Technology,2007(3):65-68.
[6]何剑锋,邬文彪.嵌入式Linux系统的Qt/Embedded图形界面开发[J].电子工程师,2007(7):46-48
HE Jian-feng,WU Wen-biao.Development of Qt/Embedded graphical interface based on linux[J].Electronics Engineers,2007(7):46-48.