基于DirectFB开发库实现可分解的嵌入式播放器的设计方案

1 、概述
随着嵌入式的普及和发展,嵌入式设备的功能越来越强大,用户对嵌入式设备的要求也越来越高。各种多媒体应用程序被移植到了嵌入式系统中,是否能够播放音视频是人们衡量和购买嵌入式设备的基本要求之一。本文提出了一种基于directfb嵌入式播放器解决方案,有效地降低嵌入式系统的资源消耗,适用于cpu频率小于400mhz的中低端嵌入式系统。directfb是一个轻量级的gui开发库,它通过framebuffer以及回调函数,实现了对硬件设备的完全抽象,加速和简化了图形操作。
本文首先对directfb进行了详细的介绍,接着提出了一种宽松的、可分解的嵌入式播放器设计方案。该方案资源消耗少、可移植性强、系统各个模块间依赖度小,使得用户能够根据自己的系统需求快速设计满足自己要求的播放器。
2 、directfb简介
2.1 directfb的整体框架
directfb必须通过linux下framebuffer驱动来访问硬件设备,它在framebuffer的基础上提供了图形设备的加速、输入设备处理提取、透明窗口和多重显示层的功能。另外directfb设计之初就充分考虑了嵌入式系统的固有特性,体积小巧,资源消耗低。作为嵌入式系统中强大的图形处理库,directfb成为linux下一代处理的一个新标准(celf avg1.0标准)。图1是directfb的整体框架。
2.2 directfb接口描述
directfb提供了一套c接口来方便用户进行界面开发,例如idirectfbsurface接口提供了对于文本、bilt、画线以及画矩形的操作。idir ectfbfont接口提供了对字体的操作,而idirectfbvideo接口提供了对多媒体进行播放控制的操作。表1对directfb接口进行了详细的描述。
3 、播放器的框架
嵌入式播放器的架构如图2所示。采用directfb开发的lite作为图形界面,与用户进行直接交互;调用directfb的video实现了音视频的插件接口和解码器模块。该接口将ffmpeg、xine、libmpeg3等多媒体库封装成统一接口,具备很强的扩展性;基于framebuffer的输出,消除了对于特定架构的依赖,有效地增强了系统的可移植性。
图形界面是以lite为基础开发的。lite是基于directfb开发的以box为基类的对话框。通过调用lite可以编写各种暂停、播放、音量等控件,用户使用这些控件与播放器进行直接交互。directfb本身并不提供窗口以及对话框管理功能,因而directfb更多地被用作底层图形库。参考文献中选择以directfb为后端的cairo图形库进行2d图形开发;参考文献中选择基于gtk+on directfb进行嵌入式开发。如今,上层api支持directfb的有xdirectfb、directfbgl、dfbterm、dfbsee、dfbpoint、qt on direelfb、sdl等。采用lite进行开发的目的,主要是因为它直接使用directfb开发对话框,而且源代码只有5 mb左右,具有很快的响应速度,能够有效降低嵌入式设备资源的消耗。
插件接口将对解码器的操作放到了video统一的开发式接口中,该接口实现了分离音视频、解码音视频、播放、暂停、调节音量、调整播放速度等各种功能。通过该接口,播放器的扩展性得到了很大的提高,因此该接口是媒体播放器的核心。
3.1 插件接口以及编解码
directfb通过对ffmpeg进行封装,形成一组统一接口方便用户调用。插件接口通过以下方法来控制解码器:
①probe函数。通过检查文件扩展名来确定播放器是否支持播放该文件,可以识别的扩展名有wav、au、snd、mp2、mp3、m2a、swf、wma、rm等。用户可以通过添加新的解码器来支持更多新的文件格式。
②construct函数。通过调用ffmpeg的一些库函数,首先将输入的视频文件头信息读取出来,接着把视频文件分离成音频和视频流,并申请音频和视频流的缓冲区,然后识别出音视频解码器。该函数同时会将用户写的一些非标准函数指针赋给标准api函数,方便用户的调用。
③ffmpeginput函数。该函数管理将对解码出的音视频包送入各自的fifo队列,同时设置了一些标志位来管理fifo队列,例如音视频队列当前的状态,当用户拖动进度条进行偏移时用户需要有一个拖动标志位,拖动的长度用来重新计算播放时间。
④ffmpegvideo以及ffmpegaudio函数。这两个函数主要用于播放音频流和数据流,同时有一些用于音视频的同步控制。
⑤ffmpeg_playto函数。该函数是给用户提供的接口函数,该接口函数在directfb中为playto。在函数中,playto同时启动了3个线程,这3个线程分别调用了ffmpeginpuit、ffmpegvideo、ffmpegaudio函数,用于将将音视频送入fifo队列,从fifo队列取出数据并播放。
播放器的数据流程如图3所示。音视频处理过程是同步进行的。
此外还有一些控制函数,例如文件播放playto、播放停止stop、按时间跳转seekto、调整音量setvolume、获取音量getvollume、调整播放速度setspeed、获取播放速度getspeed等函数,这些函数在construct函数中被封装成标准接口便于用户涮用。
3.2 lite和fusionsound
video接口通过调用ffmpeg对音视频解码进行了有效的封装。通过lite,用户与播放器实现有效交互。lite弥补directfb在工具箱以及窗口管理上的不足,相比于其他的gui,它在提供对话框和按钮的同时,资源消耗较小,适合嵌入式开发。fusionsound是一个directfb的子库,它基于oss或者alsa驱动。fusionsound将音频数据输出到了扬声器上,该函数库能够支持一些基本操作,例如wav格式文件的播放,同时它也提供一系列的声音播放、调节播放速度、调高音量、声音缓冲区管理等接口。
3.3 播放器的流程
程序运行流程如图4所示。程序首先初始化lite以及directfb库,然后初始化对话框并设置回调函数;接下来初始化一系列的按钮,例如播放、暂停、快进、声音、放大、缩小等,并设置消息触发响应函数。接着调用directfb接口中的video接口播放视频文件,然后会进入消息循环,来响应用户各种各样的按键消息。
4 、实验结果
在本实验中,采用ti公司omap-l138处理器、64m的内存开发板做实验,内存占用约为5m左右。通过内核设置,将cpu的主频设置为300 mhz,播放器在运行期间cpu的占用率为70%,播放画面十分流畅。directfb开发的播放器如图5所示。
结语
directfb是一个轻量、高效的库,但是由于缺少必要的窗口系统导致其开发效率低。搭配由directfb开发出的lite窗口系统,能很有效地进行基于对话框的程序开发。因为lite和directfb本身占用的资源极少,所以十分适合嵌入式开发。本文提供了一套嵌入式开发播放器的新思路,通过对编解码代码的优化,搭载上轻量的图形和窗口管理系统,使其能够适用于各种中低端场合。

电源防反接mos管选型选择
盘点手机行业2017:拼市场 拼趋势 拼营销
如何优化跨境电商服务器
移动互联网红利渐渐褪去 下一世代是人工智能
微型热保护器在水泵电机的应用
基于DirectFB开发库实现可分解的嵌入式播放器的设计方案
第三代半导体将写入“十四五规划”引起市场广泛关注
闪存的原片和白片是什么?
为什么英特尔会断供华为呢,三星也会受到波及呢
dfrobotLiDAR C0602 360°激光雷达测距套件(8m)介绍
乐华K73 Pro新品评析:屏幕尺寸大还送全套专业K歌设备,质价比超高
关于软件、硬件版本号命名的常见规范
连接虚实:NVIDIA Omniverse推动汽车全生命周期数字化
华为 Mate 9 续航生猛的秘密
12通道可调LED光源的制作
国际工业与能源物联网创新发展大会在温州举行
一加5与荣耀9该如何选择?一加5与荣耀9外观、配置、拍照谁更强?一加5与荣耀9区别对比评测
小米Note2的痛一次就够! 小米正在解决小米Note2最大的问题
人工智能为何是创投的最爱
4种集成电路封装形式的详细介绍