1引言
随着用户要求的不断提高,越来越多的嵌入式设备使用功能强大、价格低廉的嵌入式Linux作为操作系统并开始采用较为复杂的图形用户界面。Qt以其强大的功能、良好的可移植性逐渐成为一种被广泛使用的GUI系统。正是由于嵌入式操作系统及其相应图形用户界面的不断发展,嵌入式软件的开发显得越来越重要。其中嵌入式媒体播放器由于能够满足人们的视听享受已经逐渐成为了系统中不可或缺的重要组成部分,在嵌入式系统上开发媒体播放器已经成为了一个技术热点,当前许多嵌入式产品中都包含媒体播放器。因此在基于Qt的嵌入式系统中实现媒体播放器具有深刻的意义和实用价值。
2 嵌入式媒体播放器系统设计
2.1架构设计
嵌入式媒体播放器架构设计方案如图1所示。通过使用纯C++语言开发来支持嵌入式Linux系统,采用Qt/Embedded作为GUI来提供强大的用户界面,实现一个开放式的插件接口来增强扩展性,利用内核帧缓冲来输出,消除对特定架构的依赖,从而保证可移植性。媒体播放器属于上层应用程序,位于Linux用户空间。这样设计的目的是为了系统移植性。
图形用户界面窗口以Qt/Embedded为基础开发,通过调用Qt/Embedded提供的类库根据需要设计可以管理多媒体文件的基本窗口,包括打开、删除、显示文件长度、显示播放时间等窗口,以及为方便用户设定的管理播放列表、进行播放控制的窗口,这些都是直接和用户打交道的。由于采用了Qt/Embedded作为GUI,移植性可以得到保证。
文件输入主要是对用户指定的文件进行读取和解析,将获得的文件长度、播放时间、编码格式、音视频帧率、文件标题等内容,结合MIME的处理,显示在预先设计的窗口中。
插件接口调用主要是把所有对解码器的操作整合到一个统一的开放式接口当中,根据上一部分解析出的文件信息去查找相应的解码器插件并调用,如果没有找到可用的解码器可以返回信息提醒用户添加相应的插件。通过实现这样一个接口可以使播放器的扩展性大大提高,因此本部分是媒体播放器的核心。
文件解码和输出主要负责通过调用解码器对音视频数据流进行解码,然后利用QT/Embedded可以直接操纵内核帧缓冲FrameBuffer的特性,将解码之后的数据通过FrameBuffer直接送到输出设备输出,避免对DirectShow、OpenGL等特定架构的依赖,进一步增强可移植性。
图1 嵌入式媒体播放器的架构
3 插件接口模块和解码库模块
3.1插件接口模块设计
插件接口模块是整个播放器的核心部分,它封装了对具体解码器的操作,从而在输入和输出模块之间搭起一座桥梁,确保数据的正常流动。插件接口模块主要提供了以下方法来控制解码器:
1)文件支持性函数 bool isFileSupported(const QString&filename);
通过检查文件的扩展名来确定待播放的文件是否被播放器支持,若是返回真,否则返回假。可识别的扩展名有asf、avi、dat、mp2、mp3、mpeg、mpg、ogg、wav等。如果添加了新的解码器插件以后可以识别新的文件格式,只需要将其扩展名添加到此函数的支持列表中