APP下载

基于S3C2440A的网络流媒体播放终端设计

2012-06-06杨功银

电视技术 2012年1期
关键词:图形界面内核解码

杨功银,付 玉,黎 珍

(湖南师范大学 工学院,湖南 长沙 410086)

计算机和电子通信技术的发展将人们带入了崭新的数字化音视频世界。人们可以不再仅仅依靠易受干扰的无线电波收听广播和收看电视,还可以跨地域实时地欣赏网络上的电台和电视节目,这些与流媒体技术的出现和发展密切相关。流媒体技术让用户无需将整个文件下载完而只需等待缓冲片刻就可欣赏,其余部分在后台从服务器继续下载。目前来看,这些都是在PC机上实现的,PC机处理能力强大,但也有笨重不便携带、耗电量大及需占较大空间等缺点,有时甚至是一种资源浪费。本文将嵌入式技术引入流媒体播放领域设计了一款基于S3C2440A的嵌入式流媒体播放终端,具有体积小、低功耗、低成本及操作简单等优点。

1 系统总体方案设计

系统硬件如图1所示。S3C2440A为系统处理器,SDRAM使用两片三星公司的K4S561632构成了32位数据宽度的存储系统,并映射到S3C2440A的BANK6上。Nor Flash采用EN29LV160AB,接在S3C2440A的BANK0上用来存取引导操作系统的Bootloader。Nand Flash采用K9F2G08,其有专门的时序控制总线,不占用系统总线资源,用来存储操作系统内核、文件系统等。该播放终端通过DM9000以太网卡以有线方式或USB无线网卡以无线方式连接。UDA1341主要用来将从S3C2440A输出的数字音频信号转换为模拟音频信号输出。LCD显示模块主要是完成显示功能,具有触摸功能,方便用户观看和操作等。S3C2440A上运行一个具有所有相关驱动的Linux操作系统,将Mplayer移植到该平台上。在操作系统及网络协议的支持下,Mplayer就可以从服务器上下载音视频流,并完成解码,再由UDA1341芯片D/A转换或LCD帧缓冲显示。因嵌入式系统资源的有限性不适合Mplayer自带的图形界面运行,所以用Qt重新编写一个图形界面以方便用户操作。

图1 系统总体方案

2 硬件电路设计

2.1 S3C2440A最小系统

S3C2440A核心处理器采用ARM公司设计的16/32位ARM920T的RISC处理器,是一款低价格、低功耗、具有高性价比且广泛用于手持设备的微控制器[1]。它实现了MMU,AMBA BUS和Harvard高速缓冲体系结构,具有独立的16 kbyte指令Cache和16 kbyte数据Cache,集成有I2S音频编解码接口、LCD接口、SDRAM内存控制器、Nand Flash控制器、USB控制器、ADC及触摸屏接口等。工作主频一般为400 MHz,最高可达533 MHz。该设计中S3C2440A工作所需时钟源由外接12 MHz晶振提供。此外,采用2片三星公司的K4S561632,片选信号为 nGCS6,2 Mbyte的 Nor Flash EN29LV160AB,片选信号为nGCS0。Nand Flash不是一种总线型设备,S3C2440A提供了专用访问接口,本设计中采用256 Mbyte的K9F2G08。这样S3C2440A就和外部的时钟电路及SDRAM,Nor Flash和Nand Flash存储设备组成S3C2440A最小系统。

2.2 网络接口电路

嵌入式流媒体播放终端网络接口部分是必不可少的,该播放终端可以通过有线的以太网卡DM9000或USB WiFi无线网卡访问网络。

DM9000是DEVICOM公司生产的一款10/100(Mbit·s-1)快速以太网卡控制芯片,它实现了以太网媒体介质访问层(MAC)和物理层(PHY)的功能,集成有10/100(Mbit·s-1)自适应收发器,4 kbyte双字节的静态随机存储器,支持介质无关接口和帧唤醒,完全符合IEEE 802.3u规格,支持IEEE 802.3x全双工的流控制[2]。通过设置,外部处理器可以以8位、16位、32位这3种方式之一访问DM9000内部存储器。本设计中DM9000与S3C2440A处理器的连接如图2所示。

图2 DM9000网卡电路原理图

S3C2440A的 nGCS4与 DM9000的 AEN相连,SA4,SA5,SA6及SA7直接跟地线相连,SA8和SA9与电源连接。当AEN引脚为低电平时DM9000就被选中。SD0~SD15与S3C2440A的 DATA0~DATA15相连,CMD引脚与S3C2440A的ADDR2连接。当CMD引脚为高电平时,SD0~SD15上传输的是数据,反之传输地址。nWAIT为读写等待信号,当其为低电平时说明上条指令没执行完,当前指令需等待。nOE和nWE为DM9000的读和写允许信号,都是低电平有效。LAN_INT与S3C2440A的18号中断相连,nRESET为初始化 DM9000的重启信号,EEDO和WAKEUP引脚为默认的低电平,这决定其总线宽度为16位。X1和X2引脚两端外接25 MHz石英晶振外围电路组成 DM9000 的时钟电路。RXI+,RXI-,TXO+,TXO-为网络信号的输入和输出端。DM9000接在BANK4上,片选信号为NGCS4。

因S3C2440A集成USB控制器,硬件电路几乎不需要重新设计,只需选择一款在软件上能被支持的USB无线网卡就能实现通过无线方式访问网络。

2.3 UDA1341音频和LCD电路

UDA1341是一款飞利浦公司生产的支持I2S接口的数字音频解码芯片,它采用位元流技术进行信号处理,具备AD转换和DA转换功能,并可用PGA(可编程增益控制)和AGC(自动增益控制)对模拟信号进行处理,同时其对数字信号提供了DSP处理功能[3]。UDA1341在本设计中完成将S3C2440A送来的数字音频信号转化成模拟信号输出,UDA1341音频转换电路如图3所示。S3C2440A提供了5 根 I2S 信号线(I2SSO,I2SSDI,I2SLRCK,I2SSCLK,CDCLK)与UDA1341相应信号线相连,UDA1341的DATAI为其数据输入端,DATAO为数据输出端,BCK为其时钟输入端,WS为字选择端,SYSCLK为时钟信号线。L3MODE,L3DATA和L3CLOCK是UDA1341的L3接口总线,用来对其功能进行控制和获取状态信息。S3C2440A没有L3总线专用接口,故采用其GPB2,GPB3和GPB4引脚用软件方式模拟实现L3总线功能从而对UDA1341中的音频处理参数和系统控制参数进行配置。从UDA1341的19引脚输入的数字音频信号经过处理后,最终从24和26引脚输出到扬声器发出声音。

图3 UDA1341音频转换电路原理图

本设计中采用TFT的LCD来完成系统的显示功能,S3C2440A内部具有LCD控制器,可以支持TFT等带触摸屏功能的LCD。S3C2440A提供了让LCD模块工作的帧同步信号(VFRAME)、行同步信号(VLINE)、像素时钟信号(VCLK)、AC偏置信号(VM)及数据信号(VD0~VD23)等。硬件电路设计简单,只需将相应信号对应连接即可。

3 搭建系统软件运行平台

该流媒体播放终端选择Linux操作系统,通过移植Mplayer实现流媒体的播放,为了操作方便,用Embedded Qt编写一个图形界面操作程序。因此接下来的工作包括Linux内核的移植、yaffs2文件系统的制作、Mplayer的移植、QT图形界面应用程序的编写等。

3.1 Linux内核的移植

Linux是一个开源免费操作系统,很受广大嵌入式开发者欢迎。本设计选择Linux-2.6.31内核,其已经带有比较完善的设备驱动,不需太多修改。移植Linux的步骤如下:

1)从网络上下载Linux-2.6.31,并解压到相应目录。

2)修改其顶层 Makefile文件下的“ARCH?”和“CROSS_COMPILE?”为“ARCH=arm,CROSS_COMPILE?=arm-linu-”,并将“/arm/mach-S3C2440/mach-smdk2440.c”文件的第163行“S3c24xx_init_clocks(16934400)”修改为“s3c24xx_init_clocks(12000000)”,使输入时钟为12 MHz。

3)下载yaffs2源码,通过执行其目录下的“patchker.sh”脚本给Linux-2.6.31打上补丁,使其支持yaffs2文件系统。

4)添加或修改相关驱动代码后,执行“make menuconfig”命令进入图形配置界面对内核进行裁剪和配置。配置好内核后,在Linux内核根目录下执行“make zImage”命令编译,“arch/arm/boot”下将生成内核映像文件zImage。

3.2 Yaffs2文件系统制作

Yaffs2文件系统非常适合在Nand Flash上运行。制作文件系统的步骤如下:

1)首先建立一个root_2.6.31目录,再在root_2.6.31下建 立/bin,/etc,/dev,/home,/lib,/mnt,/opt,/proc,/root,/sbin,/sys,/tmp,/usr,/var等根文件系统目录。

2)获取busybox1.15.2源码,修改其顶层Makefile中的“CROSS_COMPILE=arm-Linux-,ARCH=arm”。再执行“make menuconfig”进入图形界面进行配置。然后执行“make”和“make install”命令编译安装。

3)将busybox1.15.2安装后生成的文件复制到root_2.6.31相应文件夹下,并在dev目录下执行“mknod console c 5 1”和“mknod null c 1 3”命令建立两个设备节点。

4)制作文件系统的准备工作做好后,使用mkyaffs2image工具执行“mkyaffs2image root_2.6.31”,“root_2.6.31.bin”命令生成yaffs2文件系统镜像。

3.3 Mplayer的移植

Mplayer是一款开放源代码的音视频播放器,自带解码库,也可以通过外挂解码库以支持播放更多格式的视频文件或流媒体[4]。本设计采用MPlayer-1.0rc2版本。由于Mplayer本身就具备播放网络流媒体的功能,采用将其移植到ARM平台的方法大大减少了开发工作。

3.3.1 live555的编译

Mplayer对网络流媒体的在线播放功能离不开RTSP和MMS协议的支持,因此配置编译Mplayer之前需编译live555协议库,此过程并不复杂,过程如下:

1)从网络获取live555协议库,修改其live目录下“config.armLinux”文件中变量“CROSS_COMPILE”为“CROSS_COMPILE?=arm-Linux-”。

2)在live根目录下执行“./genMakefile armLinux”命令,生成Makefile文件后,执行make命令。

3)执行“cp-r live/usr/local/lib”命令,这样Mplayer编译时就可以找到它了。

3.3.2 WMA的解码器优化

由于S3C2440A处理器上没有用于浮点运算的协处理器,不支持浮点运算。当前许多网络电台采用了WMA格式或者MP3格式,MP3的定点解码可通过移植libmad解决,这里不详述。Mplayer的FFMPEG解码库解码WMA采用了大量浮点运算,直接使用会造成无声现象,所以先进行优化。对WMA解码器进行优化的方法有浮点运算转定点运算、以空间换时间及手工汇编等。Mplayer主程序调用WMA解码程序的过程如图4所示,图中的wma_decode_superframe,wma_decode_frame 和 wma_decode_block这3个函数在解码过程中被调用频繁,耗时较多,需对其优先优化[5]。此过程相当繁琐,工作量很大,因此不详细叙述具体过程。优化后能够满足系统对WMA格式解码的要求。

图4 WMA主要解码函数及其关系

3.3.3 配置编译Mplayer

Mplayer移植的准备工作做好后就可以对Mplayer配置编译了,配置如下:

./configure--disable-mencoder- -enable-Linux-devfs--disableiconv--disable-dvdnav--disable-dvdread--disable-dvdread-internal--disable-libdvdcss-internal--enable-libavcodec_a--enable-libavcodec_mpegaudio_hp--enable-mad--disable-mp3lib--disable-ivtv--enable-fbdev--enable-ossaudio--cc=arm-Linux-gcc--host-cc=gcc--target=arm-Linux--enable-static

其中“--cc=arm-Linux-gcc”用来指定交叉编译工具,“--target=arm-Linux ”用来指定运行平台,“--hostcc=gcc”用来编译需要在host上执行的中间文件,“--enable-static”表明使用静态链接库,“--enable-live”选项让Mplayer支持流媒体协议,其他选项含义都可通过执行“./configure-help”查看。配置完后,就会在相应目录下生成Makefile文件,然后通过执行make命令,编译完后在其顶层目录就生成可执行的mplayer文件。

3.4 Qt图形操作界面应用程序编写

Qt/Emdedded是Trolltech公司开发的面向嵌入式系统的Qt版本,其移植方便,简单易学,所以本设计采用它编写一个方便用户操作的图形界面应用程序。Mplayer有一种工作模式叫slave模式,在此模式下,它能够接受用户的输入命令行,具体能够支持的命令行通过执行mplayer-input cmdlist可得到。用户界面中有通过QPushButton类实例实现的打开文件、播放、暂停、停止等控件,这些控件被放在MainWindow这个类中。通过公有继承QWidget的方法编写一个用于显示播放界面的Player类,Player中有一个QProcess类成员,在Player类的构造函数中用它的成员函数start()就可执行Mplayer程序,相关代码如“mplayerProcess- > start(tr("/usr/bin/mplayer"),args);”。其 中mplayerProcess为 QProcess的实例化,args为传递给mplayer的参数。传递给 Mplayer的控制命令可通过QProcess的write()函数进行。如实现Mplayer停止运行的代码如“mplayerProcess->write(“quit ”);”。实现其他控制功能类似。

类MainWindow和类Player之间及它们的成员之间是独立的,不能相互通信,解决这一问题的是Qt的信号和槽机制,编程中具体实现这一功能的是connect()函数,这一函数将各类的信号与信号或信号与槽关联使得各类相互配合实现复杂的功能。如实现点击播放功能的代码如“connect(playButton,SIGNAL(clicked()),this,SLOT(slotPlay()));”。当点击播放按钮时就会发射clicked()信号,此后实现播放功能的slotPlay()函数就会立即执行,实现网络流媒体的播放。设计好图形操作界面后,就可以方便地操作Mplayer了。

4 小结

本文通过移植Mplayer的方法在S3C2440A平台上实现流媒体播放终端,并用QT为其编写了一个图形操作界面,可以通过有线或无线两种方式访问网络。测试表明,在网络畅通的地方,可以非常清晰地收听网络广播和较流畅地收看网络电视。实现的这款嵌入式流媒体播放终端具有体积小、功耗低及成本低的优点,能让人们享受流媒体带来的学习和生活上的方便及乐趣,有着良好的市场应用前景。

[1]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.

[2]韩超,王可人.基于DM9000的嵌入式系统的网络接口设计与实现[J].工业控制计算机,2007,27(20):17-18.

[3]胡力刚,许伟明,焦阳.基于S3C2410A和UDA1341TS的嵌入式音频系统设计[J].计算机测量与控制,2009,17(12):2511-2512.

[4]周金和,焦瑞莉,王勇.嵌入式IPv6网络视频终端[J].电视技术,2006,30(12):35-38.

[5]张海滨,李挥.基于S3C2410的WMA开源解码程序优化[J].计算机工程与设计,2009,30(1):13-15.

猜你喜欢

图形界面内核解码
《解码万吨站》
强化『高新』内核 打造农业『硅谷』
解码eUCP2.0
基于嵌入式Linux内核的自恢复设计
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
Linux内核mmap保护机制研究
用VMRun快速置备千台虚拟机
微生物内核 生态型农资
重看图形界面“扁平化”与“拟物化”之争——关于设计思维的探讨