在此主要针对设备文件/dev/video进行视频捕捉方面的程序设计。
其中用到的主要函数有:
Camera_open():用来开启视频设备文件,使用前需要首先声明一个video_device类型的设备文件。
Camera_get_capability():通过调用ioctl()函数取得设备文件的相关信息,并存放到video_capability结构中。
Camera_get_picture():通过调用ioctl()函数取得图像的相关信息,并且存放到video_picture结构中。
Camera_close():用来关闭设备文件。
Camera_grab_image():用来抓取图像,采用mmap方式,直接将设备文件/dev/video0映射到内存,加速文件I/O操作,还可以使多个线程共享数据。
剩下的还有设备初始化、参数设备等相关函数,这里不再详述。
3.3 视频压缩编码模块
获取图像数据后,可以直接输出到FrameBuffer进行显示,由于该系统要将采集到的视频影响通过网络传输出去,所以在传输之前要对原始的图像数据进行压缩编码,在此选用映佳公司的MPG440芯片来实现MPEG-4视频编解码方案。与其他标准相比,MPEG-4压缩比更高,节省存储空间,图像质量更好,特别适合在低带宽条件下传输视频,并能保持图像的质量。对视频流进行压缩编码以后,接下来就要实现网络传输部分的功能。
3.4 JRTPLIB网络传输模块
流媒体指的是在网络中使用流技术传输的连续时基媒体,RTP是目前解决流媒体实时传输问题的最好办法,JRTPLIB是一个面向对象的RTP库,他完全遵循RFCl889设计,下面讲述如何在Linux平台上运用RTP协议进行实时流媒体编程。
3.4.1 初始化
在使用JRTPLIB进行实时流媒体数据传输之前,首先应该生成RTPSession类的一个实例来表示此次RTP会话,然后调用 Create()方法来对其进行初始化操作。RTPSession类的Create()方法只有一个参数,用来指明此次RTP会话所采用的端口号。
3.4.2 数据发送
当RTP会话成功建立起来之后,接下来就可以开始进行流媒体数据的实时传输了。首先需要设置好数据发送的目标地址,RTP协议允许同一会话存在多个目标地址,这可以通过调用RTPSession类的AddDestination()、DeleteDestination()和 ClearDestinations()方法来完成。目标地址全部指定之后,接着就可以调用RTPSession类的SendPacket()方法,向所有的目标地址发送流媒体数据。
3.4.3 数据接收
对于流媒体数据接收端,首先需要调用PollData()方法来接收发送过来的RTP或者RTCP数据报。由于同一个RTP会话中允许有多个参与者 (源),因此既可以通过调用GotoFirstSource()和GotoNextSource()方法来遍历所有的源,也可以通过调用 GotoFisstSourceWithDat()和Got-oNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检测出有效的数据源之后,接下去就可以调用RTPSession类的Get-NextPacket()方法从中抽取RTP数据报,当接收到的RTP数据报处理完之后,要及时释放。
JRTPLIB为RTP数据报定义了3种接收模块,通过调用RTPSession类的SetReeeiveMode()方法可以设置下列这些接收模式:
RECEIVEMODE_ALL:缺省的接收模式,所有到达的RTP数据报都将被接受;
RECEIVEMODE_IGNORESOME:除了某些特定的发送者之外,所有到达的RTP数据报都将被接受,而被拒绝的发送者列表可以通过调用 AddTo-IgnoreList(),DeleteFromlgnoreList()和ClearIgnoreList()方法进行设置;
RECEIVEMODE_ACCEPTSOME:除了某些特定的发送者之外,所有到达的RTP数据报都将被拒绝,而被接受的发送者列表可以通过调用 AddTo-AcceptList(),DeleteFromAcceptList和ClearAcceptList()方法来进行设置。
3.4.4 控制信息
JRTPLIB是一个高度封装后的RTP库,只要PollData()或SendPacket()方法被成功调用,JRTPLIB就能够自动对达到 RTCP数据报进行处理,并且还会在需要的时候发送RTCP数据报,从而能够确保整个RTP会话过程的正确性。在系统中,使用 RTPSessionJRTPLIB类库提供的方法来实现底层的RTP/RTCP操作,并且把他封装在CrtpTransmitter类中,该类从 MediaSink类继承而来,接收到相应的媒体帧数据,使用RTPSession类库的操作把数据发送到网络上。
4 结语
因为系统是以S3C2410平台和Linux操作系统为基础,利用Video4Linux设计采集程序,使用MPEG-4压缩编码,通过实时流媒体传输技术实现网络传输的,所以软硬件成本低廉,体积小巧,整个系统具有稳定可靠、安装简便等特点,而且监控距离可随网络延伸不断加长,具有良好的发展应用前景。可扩展应用在工业控制、视频会议系统、可视电话、远程监控系统等诸多领域。