|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
<strong>1 引言</strong>
视频监控技术在国民生产的许多领域发挥着重要的作用。随着嵌入式技术的逐渐发展和成熟,手持监控终端成为可能。而手持监控终端的可携带性和低功耗更极大地扩展了视频监控的应用范同。本课题探索了一种手持监控终端的设计方案。提供了简捷易用的图形用户界面.实现了对MPEG4格式视频压缩数据的解码及其在LCD上的播放。
<strong>2 系统的硬件平台</strong>
本系统的处理器选用三星公司生产的具有ARM9内核的S3C2410.S3C2410是32位RISC CPU.内部带有全性能的内存处理单元(MMU).主频为203MHz,最高可达260MHz。芯片内部集成了大量的功能单元.包括:外部存储器控制器、LCD控制器以及8通道10位ADC和触摸屏接口等。系统的电源模块采用TI公司的TPS73HD3XX系列芯片进行电压转换.可以分别获得1.8V和3.3V电压。根据应用的需要.本系统选用了1M NOR Flash AM29LV800DB,64M NAND Flash U-K9F1208UDM-YC80和两片32M SDRAM K4S561632C-TC75。液晶采用的是320x240的TFT真彩(65536色,16位)液晶屏。触摸屏采用的是四线制电阻式触摸屏。系统的硬件结构框图如图1所示。
<ignore_js_op>
2010-5-5 13:28:11 上传
<strong>下载附件</strong> (4.52 KB)
</ignore_js_op>
图1 系统硬件框图
<strong>3 系统的软件设计</strong>
本手持终端选用嵌入式Linux作为操作系统。在此基础上运用了两个开源软件:图形用户界面库MiniGUI和视频编解码库ffmpeg。
3.1 基于MiniGUI的图形用户界面
MiniGUI是由北京飞漫软件技术有限公司丰持的一个自由软件项目.它为基于Linux的实时嵌入式系统提供一个轻量级的罔形用户界面支持系统。本系统的图形用户界面使用了这个库来实现,它负责运用和管理FrameBuffer帧缓存驱动、触摸屏和键盘驱动程序。通过MiniGUI库。系统图形用户界面相关的部分得到厂很好的实现.成功的建立了包括按钮、菜单和背景网片在内的图形用户界面。特别需要指出的是.因为本系统的数据接收和实时视频解码的操作涉及到大量的数据处理,所以应用程序会分别为这些操作新开线程,如果一个线程因为数据的处理失败而阻塞,图形用户界面线程仍可正常工作。用户仍可以和软件交互.终止阻塞的线程。
3.2 视频解码线程
本课题中。手持设备通过网络接收MPEG4格式的视频数据所以需要在手持设备上移植MPEG4的解码库。经过对比和分析,选择了ffmpeg开源项目作为这个手持设备的解码库。ffmpeg是自南软件,为多媒体系统实现MPEG4流媒体技术提供了完整的解决方案.主要的组成部分是libavformat和libavcodec库。libavcodec包含了很多常见的音视频编解码器.而libavformat则能够很好的支持大部分的音视频文件格式。
实时接收到的视频数据可以作为一种特殊的流媒体文件.这种文件与一般的视频文件相同。都有若干个基本的组成部分。首先,文件自身可以被叫做一个“容器”(container),“容器”的类型决定了视频信息在文件中所处的位置。其次,文件包含有若干个“流”(stream);比如,通常有一个音频流和一个视频流(一个“流”只是一个对于一系列数据组成单位的形象的称呼)。一个流中的数据组成单位叫做“帧”(frame)。每一个流由不同的“解码器”解码。从流中可以读出“包”(packet)。包是一些数据块,这些数据块中包含了压缩后的原始帧的数据。下面详细地介绍一下利用ffmpeg的API函数进行解码的过程。
首先,利用av_register_all()函数进行库的初始化,向编解码库注册所有可用的文件格式和编码器,所以当有对应的格式的文件被打开的时候.相应的解码器可以被自动地调用。通过av_open_input_file()函数打开视频文件,把关于文件格式的头和储存信息读到一个AVFormatContext结构体中。接着,利用av_find_stream_info()函数检查存储在AVFormatContext结构体中的文件的流信息,这个函数把正确的信息存储在一个指针集合中.在这个集合中就可以找到需要的视频流。关于流的编解码器信息在AVCodecContext结构体中,通过它就可以找到真正的编解码器并且打开它。
利用avcodec_alloc_frame()函数分配一个用来存储帧的空间pFrame。因为手持终端播放的视频是565-bit的图像,所以还需要把帧从原始格式转化成RGB格式。ffmpeg提供了img_convert()函数做这个转换。注意为转换还需另外分配一个帧pFrameRGB用来存放转换后的数据。接下来依次从视频流中读原始帧的数据包把数据包解码到上面分配的pFrame中,一旦完成了一个帧的解码,就把这个帧转换成要求的RGB数据格式并且在液晶屏上显示解码后的视频图像。系统解码的过程如图2所示。
<ignore_js_op>
2010-5-5 13:28:12 上传
<strong>下载附件</strong> (8.46 KB)
</ignore_js_op>
图2 系统解码的过程
3.3 数据接收线程
手持监控终端通过SOCKET与视频采集设备建立连接接收视频数据.但是接收到的MPEG4数据,必须进行一定量的缓冲.然后才能调用ffmpeg的API函数进行解码处理。本手持监控终端在内存中建立两个队列,一个是空闲的缓冲队列,用以存放接收到的数据:另一个是尚未处理的数据队列.等待处理.两个队列头尾相连组成一个环形缓冲列表。数据接收线程方面:当手持监控终端接收到一个包的数据,就从缓冲队列的头拿出一个缓冲区块,把接收到的数据存放到这个缓冲区块中,然后将这个缓冲区块加入到数据队列的尾部等待视频解码线程的读取。视频解码线程方面:从数据队列的头拿出一个缓冲区块,读取数据,将读完的缓冲区块加到缓冲队列的尾部,等待再一次地接收数据。经过测试,选择32个缓冲区块,每个缓冲区块的大小选为24KB,会获得比较好的抗扰动,抗延时的播放效果。系统的软件结构框图如图3所示。
<ignore_js_op>
2010-5-5 13:28:12 上传
<strong>下载附件</strong> (6.98 KB)
</ignore_js_op>
图3 系统软件框图
<strong>4 结束语</strong>
本文针对S3C2410硬件平台和Linux操作系统,设计并完成了在手持监控终端上对实时视频的播放,基本上达到了,预期的要求。由于本课题只是借鉴了流媒体的思想,利用的不是真正的流媒体技术所以会产生一定的播放延时,接下来的工作会探索流媒体技术在手持视频终端上的应用,进一步减少延时,以便可以更好的将流媒体技术利用到视频监控中。
创新点:本文所提出的手持监控终端的设计方案充分利用了S3C2410的功能,并且创新性的把ffmpeg视频编解码库移植到了基于S3C2410的硬件平台上.通过建立循环数据链表的方法实现了视频数据的接收和解码的同时运行。
目前整套设备的市场价格预计在0.5万元左右。
作者:党帅,王库 来源:《微计算机信息》(嵌入式与SOC)2009年第9-2期 |
|