摘要:本文详细介绍了嵌入式系统的特点以及嵌入式系统开发的流程,分析基于嵌入式Linux的MP3播放器的关键技术,设计和实现了一种基于嵌入式系统的 MP3 播放器。该播放器利用 QT 技术和开源的音频解码器 libmad编程实现,运行在嵌入式 Linux和 ARM9 硬件平台。最后就今后播放器开发过程中一些问题进行了探讨。
关键字:嵌入式 Linux MP3 播放器 QT
Designand implementation of MP3 player based on embedded Linux
ZHAO Peng
(Department of Computer Science and Technology, Taiyuan NormalUniversity, Taiyuan ,Shanxi 030012)
Abstract:This paper gives the characteristic of the embedded system and theprocess of the embedded system development. Based on the analysis of the MP3 playerkey technology a kind of MP3 player is designed and implemented by use of QTtechnology and open-source
audio decoder library libmad. It can run on theLinux and ARM9 hardware platform. At last the paper gives some issues in thefarther research.
Key words:embedded; Linux; MP3 player; QT;
我们身处在物联网、云计算、3G和三网合一这样的一个风起云涌的时代,在这些技术背后有一个很重要的技术支撑平台——嵌入式系统开发。更有人提出我们现在身处在后PC时代,即嵌入式时代。嵌入式不仅广泛应用于工业控制、通信设备、信息家电、医疗仪器等领域,而且大量应用于手机、PDA等消费类电子设备。MP3 作为高质量音乐压缩标准,数据压缩比率大,回放质量高。在这些个人消费电子设备中实现 MP3播放功能显得十分有必要。本文在研究分析了 MP3 文件格式与解码原理后,详细介绍了基于 Linux 操作系统的嵌入式MP3 播放器的设计与实现过程。
1. 前言
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统[1]。
嵌入式产品的特点:从性能角度看,嵌入式产品范围广,不同的产品的方向不同,这些方向主要有:体积、成本、功耗、稳定性、实时性、功能和外观等。从技术角度看,软硬件结合,操作系统在嵌入式产品中的应用越来越广,所有的通用计算机技术都有可能被应用在嵌入式产品中,需要和具体行业技术结合,开发难度大,周期短。
嵌入式系统与一般PC系统的区别
l 嵌入式系统专用于特定的应用,而PC是通用计算机;
l 使用多种类型的处理器与处理器的体系结构;
l 关注成本;
l 大多有功耗约束;
l 经常在极端的环境下运行;
l 系统资源比PC少的多;
l 需要专用工具和方法进行开发设计;
l 嵌入式系统的数量远远超过PC.
2. 嵌入式产品开发的流程
嵌入式产品开发流程:
l 开发前期准备工作
需求分析,可行性分析;
l 具体的技术开发
硬件设计、嵌入式系统构建、驱动编程、应用编程、GUI开发、电源管理、启动时间、算法优化、实时性优化、系统测试、产品模具结构设计及组装;
l 开发后期工作
用户体验测试、产品送检、小批量生产测试、大批量生产;
3. 基于嵌入式Linux的MP3播放器的技术
3.1 Linux文件I/O
文件是Linux系统中最基本也是最重要的一个概念。Linux系统提供的一个非常重要的功能就是文件系统。Linux遵循一切都是文件的理念,因此,绝大多数交互操作都可以使用类似文件的读取和写入等来实现,即使所操作的对象不是普通的文件爱你,而是硬件设备,也是一样来对待,从而实现了一定的统一。
文件只有被打开才能被访问。文件可以以只读方式或者只写的方式来打开,也可以两者兼有。一个被打开的文件通常使用文件描述符的唯一标识进行引用,这个描述符是打开文件的元数据到它本身的映射。在Linux系统内核中,文件描述用一个非负的整数来表示,文件描述符在用户空间共享,允许用户应用程序通过文件描述符来直接操作文件。当打开一个现存文件或者创建一个新文件时,内核就会向进程返回一个文件描述符,当读写一个文件时,用open或者creat返回的文件描述符用来标识这个文件,将它作为参数传递给read或者write。
3.2 Linux进程和线程编程
进程就是指系统正在执行的程序,也就是队列中正在执行的任务,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件。而进程是一个开始执行但是还没有结束的程序的实例。就是可执行文件的具体实现。一个程序可能有许多进程,而每一个进程又可以有很多子进程。在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。为了充分的利用资源,系统还对进程区分了不同的状态,将进程分为新建、运行、阻塞、就绪和完成五个状态。
每个进程至少需要一个线程。进程由两部分组成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。
3.3 QT编程
目前的桌面机操作系统大多有着美观、操作方便、功能齐全的GUI(图形用户界面),例如KDE或者GNOME。GUI(图形用户界面)是指计算机与其使用者之间的对话接口,可以说,GUI是当今计算机技术的重大成就。它的存在为使用者提供了友好便利的界面,并大大地方便了非专业用户的使用,使得人们从繁琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作。[2]
在嵌入式系统中,GUI的地位也越来越重要,但是不同于桌面机系统,嵌入式GUI要求简单、直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。
嵌入式GUI特点:
l 体积小;
l 运行时耗用系统资源小;
l 上层接口与硬件无关,高度可移植;
l 高可靠性;
l 在某些应用场合应具备实时性
Qt/Embedded是Trolltech公司(目前已被Nokia收购)为嵌入式系统开发的Qt版本。从Qt 4.1版本开始,Qt/Embedded改名为Qtopia Core,又从Qt 4.4.1版本开始,Qtopia Core又改名为Qt for Embedded Linux.
4. 基于嵌入式Linux的MP3播放器的设计与实现
由于 Linux 具有开放源码,软件资源丰富,性能高效、稳定,支持多种体系结构,大小、功能都可定制,价格低廉等优点,本MP3 播放器系统基于嵌入式Linux操作系统来实现。而MP3 播放器的界面设计则采用Qt/Embedded技术,它是著名的Qt 库开发商挪威 Troll-Tech 公司面向嵌入式系统的 Qt 版本。其特点是可移植性好,产品较成熟,开发文档和SDK齐全,对内存资源需求少,显示性能好等[3]。
而对于 MP3 播放器一些底层功能的实现,可以基于一些开源音频解码库,只要开发者遵循开发协议即可,这样可以加快开发速度和减少开发成本。在本 MP3 播放器的设计和实现的过程中,主要采用 libmad 解码库。libmad是一个开源的高精度MPEG音频解码库,它提供 24-bit 的PCM输出。用 libmad 解码库对 MP3 文件进行解码播放的音质比较好,而且使用libmad提供的API,可以实现 MP3 数据解码和顺序播放[4]。
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 4096
int audio_fd;
unsigned char audio_buffer[BUF_SIZE];
intmain(void){
//-- 1. 打开声卡设备文件, 可写的
audio_fd =open("/dev/dsp",O_WRONLY);
//-- 2. 打开声卡设备文件失败
if(audio_fd< 0 ){
perror("openerror
");
exit(1);
}
//-- 3. 设置声卡读取格式
int format;
format =AFMT_S16_LE;
if(ioctl(audio_fd,SNDCTL_DSP_SETFMT,&format) == -1){
perror("SNDCTL_DSP_SETFMT");
exit(1);
}
//-- 4. 设置声卡的声道
int channels= 2;
if(ioctl(audio_fd,SNDCTL_DSP_CHANNELS,&channels) == -1){
perror("SNDCTL_DSP_CHANNELS");
exit(1);
}
//-- 5. 设置声卡的播放速度
int speed =44100;
if(ioctl(audio_fd,SNDCTL_DSP_SPEED, &speed) == -1){
perror("SNDCTL_DSP_SPEED");
exit(1);
}
//-- 6. 打开音乐文件
int fd;
fd =open("nuannuan.wav",O_RDONLY);
if(fd<0){
perror("opensound file error
");
close(audio_fd);
exit(1);
}
int ret;
while(1){
//-- 读音频文件
ret=read(fd,audio_buffer, sizeof(audio_buffer));
if(ret<0){
perror("readerror
");
break;
}
if(ret==0){
break;
}
//-- 往声卡设备文件中写
ret =write(audio_fd,audio_buffer,ret);
if(ret<0){
perror("writeerror
");
break;
}
}
close(fd); //关闭文件
close(audio_fd); //关闭声卡
return 0;
}
5. 小结
本系统实现了播放MP3的功能,达到了市场上其他MP3播放器的效果。需要进一步改进的是网络功能,可以实现边下载数据,边播放音乐。还要做的增加Sqlite数据库,对歌曲进行存储和管理。
参考文献:
1. 李亚锋, 欧文盛. ARM 嵌入式 Linux系统开发从入门到精通 [M].北京:清华大学出版社,2007
2. 倪继利.Qt 及 Linux 操作系统窗口设计[M].北京:电子工业出版社,2006
3. 博创科技.MP3 播放器与U盘设计[M].北京:清华大学出版社,2007
4. 汪永好基于嵌入式 Linux 的 MP3 播放器的设计与实现[J].计算机工程与设计,2009
作者简介:
赵鹏,1973年出生,太原师范学院计算机系讲师,研究方向:数字图书馆,数据仓库,软件工程和嵌入式系统。发表论文十余篇,出版著作一部,参与多项省部级项目。