- UID
- 1029342
- 性别
- 男
|
在以下的代码片中,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元以内。其在图像帧速、图像质量、对发送端处理能力要求、接收端系统成本等因素之间,找到了一个较好的平衡点。 |
|