视频传输数据量大、实时要求高,而完成无线视频传输,无线链路的数据吞吐量必须大于视频数据流量。近年来Wi-Fi标准不断演进,传输速度越来越高;另一方面,嵌入式处理器的处理能力越来越强,并且芯片厂商会在某些嵌入式处理器中集成DSP核心,使得嵌入式系统的视频解码能力有了一个大幅提高,完全能够完成高解析度的视频解码,这使得传送经过压缩的视频数据成为可能,从而间接地降低了视频数据流所占带宽的大小。这一切,使得无线视频传输成为可能。
1 系统硬件构成
1.1 系统整体框架
该系统由视频发送端和视频接收端组成,它们之间以Wi-Fi作为通信链路。如图1所示,视频发送端是需要进行幻灯片播放的普通计算机,视频接收端是采用ARM11处理器的嵌入式系统,它负责接收、解码视频信号,并通过VGA接口将视频信号传送至大屏幕显示设备上(如投影仪,大屏幕平板电视等)。
1.2 视频接收端硬件构成
图像接收端采用以三星公司S3C6410芯片为主控的嵌入式系统。S3C6410芯片采用65 nm制程,最高主频可达667MHz。其内部采用了ARM11核心作为主控部分,并集成了存储器控制器、USB控制器、LCD控制器等多种外部设备控制、接口;与此同时,S3C6410还集成了多媒体加速内核(Multimedia Acceleration)。S3C6410芯片如图2所示。
该芯片中集成的多媒体处理核心包括了JPEG编译码器,可以实现对JPEG格式图片的硬件解码,从而大大提高了系统对JPEG图片的处理能力。它最大支持编解码65 535x65 535分辨率的JPEG图片。接收系统框图如图3所示。
视频接收端配备了Marvell 8636为主控的Wi-Fi模块,其支持802.11b/g标准,通过SDIO接口与系统相连。
视频数据经解压后输出到数模转换模块上,最终转换为VGA信号送至投影仪。
[page]
2 系统软件设计
2.1 系统软件框絮
视频发送端软件的主要功能:采集当前屏幕显示图像,压缩图像,传送经压缩的图像。除此以外发送端软件还需要完成与接收端连接的建立、断开功能。与之对应的,接收端软件的主要功能是:接收经过压缩的图像数据,进行图像解码,显示图像。发送端和接收端之间通过Wi-Fi链路传输数据。系统软件构架框图如图4所示。
在会议场合,典型的演示方式是播放幻灯片,在这种应用场合下,图像在大部分时间下都是准静态的,所以在这种情况下视频的刷新速度可以保持在一个较低的数值上,这里我们设定为8帧每秒。此时,若计算机的屏幕分辨率是1 280×800,色深是24 bit,则视频流的速率是197Mb/s。
而目前普遍采用的802.11 g Wi-Fi标准,其标称速度只有54 Mbps,并不能满足以上所需的数据带宽。所以需要对数据经行压缩。在1 280x800的分辨率下,压缩率需要在5:1以上,可以考虑选用JPEG标准。JPEG压缩品质比较如图5所示。
JPEG是很灵活的编码标准,其Q值可以在100以内任意取值。但如果图片质量过高,不但增加了图像编码时CPU的负担,而且增加了数据传输量;而图片质量过低又会影响演示质量。需要在图像质量和数据流量之间找到一个平衡点。
图5是图片在不同的JPEG编码质量下的效果比较,当Q取50时,进过压缩的图片在肉眼观察下任然拥有较高的画质。而此时,压缩率是15:1,大于前面分析中提出的5:1压缩率要求,在这种情况下数据速率为13 Mb/s,能够在802.11 g提供的带宽下进行传输。可见,Q=50时,图像质量和数据流量之间可以取得一个较好的平衡。
2.2 视频发送端软件设计
该系统的发送端软件基于windows设计。其实现的主要功能可以概括为:采集当前屏幕显示图像,压缩图像,传送经压缩的图像。发送端软件流程图如图6所示。
在windows环境下捕捉当前屏幕的方法有:GDI,DirectX,以及Windows media API。其中采用GDI时效率不高,不适合应用在该系统中,这里选用DirectX。
在DirectX中提供了g_pd3dDevice对象,这是一个IDixeet3DDevice9对象,可以调用IDirect3DSudace9::LockRect()方法来获得一个指针,这个指针指向当前显示缓存的首地址,再使用合适的算法计算出当前显示缓存区的大小,就可以很方便地复制显示缓存的内容至指定内存区域,并采用JEPG标准压缩所采集到的数据。具体原理和过程如下:每一个DirectX程序都包含了后台缓存,与此同时,每个程序在默认状态下都可以访问前台缓存,前台缓存即存储了当前的Windows桌面内容。访问这个前台缓存就可以捕捉当前桌面所显示的画面。以下是捕捉屏幕的关键代码。
[page]
在以下的代码片中,g_pd3dDevice是一个IDirect3D Device9对象,这里假设它已经被初始化过了。这段代码捕获了所需的桌面图像,其后需要对所捕捉到的位图进行处理。此时可以调用IDirect3DSurface9::LockRect()方法,来获得一个指向所所捕获到的位图首字节的指针,然后根据屏幕的尺寸来确定位图的大小,最终将所需的位图数据复制到事先定义好的缓存中。
需要注意的是,以上代码中所捕捉到的位图,它的宽度不一定就是屏幕的实际宽度,这是由于在存储位图时采用了内存对齐的方法,在位图中内存被按字(word)对齐,所以在每行的结尾处可能需要添加额外的字节来完成内存对其,从而使位图宽度大于实际屏幕宽度。此时可以使用lockedRect.Pitch来获得每行的实际宽度。
捕捉图像和压缩图像时采用双缓冲模式:在0时隙内,捕捉线程将数据写入Buffer A中,压缩线程Buffer B中的图像,Buffer B中存储了在上个时隙中采集完毕的图像数据;在1时隙,捕捉线程将数据写入Buffer B,压缩线程处理Buffer A中的图像。
图像捕捉线程和图像压缩线程构成了—个典型的“生产者-消费者”系统,在采用双缓冲的基础上再增加信号机制,可以很好地解决系统中同步与互斥问题。双缓冲示意图如图7所示。
发送部分调用windows中所提供的相关Winsock(套接字)函数来完成网络传输功能,这里选用UDP协议,并采用丢包、错包不重传机制。(接收端的图像每1/8秒刷新一次,丢弃部分图像数据并不会明显降低用户的使用体验。)
考虑到在该系统所应用的实际场合中,往往会遇到演示画面在较长一段时间内(数秒至数分钟)并不发生任何变换的情况,可以在图像发送端软件中加入前一帧数据与当前帧比较的功能,若数据未发生改变,则不压缩也不传送图像数据,而只是传送给接收端一个特殊的保持信号,这样可以大大降低处理器负荷以及无线网络的传输负荷,使得无线网络还有余力完成其他用户的其他任务。
2.3 视频接收端软件设计
图像接收端采用嵌入式Linux操作系统。Linux具有内核可剪裁、开放源代码、开发周期短等优点,并且支持完整的TCP/IP协议栈。
接收端软件主要功能为:接收经压缩的图像数据,控制处理器中多媒体处理核心解码JPEG图像,显示图像。这里也可以采用相似的双缓冲方法,在接收和解压线程之间设立双缓冲,各自拥有一个轮回跳动的指针来交替对两片缓冲区经行操作。
图像解压模块负责将接收到的JPEG图像还原为位图。它将利用S3C6410芯片内部的硬件解码来加速系统的执行效率。解压后的数据将被直接写入显示缓存中。
6410的JPEG解码过程如下:初始化用CresteFile打开“JPG1:”解码驱动,每次解码首先要获取Stream Buffer(IOCTL_JPG_STRBUF),将JPEG数据拷贝到Stream Buffer,接着调用解码(IOCTL_JPG_DECODE),最后通过获取Frame Buffer(IOCTL_JPG_GET_FRMBUF)得到解码后数据。
在系统运行过程中若出现数据量超出处理能力的情况,则采用直接丢弃的处理方法。接收端软件流程图如图8所示。
3 结束语
本系统基于三星公司的S3C6410处理器以及Wi-Fi技术,能够完成8帧/秒的无线视频传输,并提供了较好的图像质量(JPEG品质因数50)。图像接收端能够完成对JPEG图片的实时解码。适合应用在低帧速视频传输场合,如幻灯片播放,计算机操作演示、教学等。该系统中的视频接收端的硬件成本可以控制在600元以内。其在图像帧速、图像质量、对发送端处理能力要求、接收端系统成本等因素之间,找到了一个较好的平衡点。
上一篇:基于ARM的Linux下LonWorks总线设备驱动设计
下一篇:基于ARM7实时网络的设计和实现
推荐阅读最新更新时间:2024-03-16 12:52