当前位置:首页 > 基于ARM的网络视频监控系统的设计与实现
东北大学本科毕业设计(论文) 第5章 视频采集功能的设计
headerframe= (struct frame_t*) vd->ptframe [vd->frame_cour]; snprintf (headerframe->header, 5,‖%s‖.‖SPCA‖); headerframe->seqtimes=ms_time (); headerframe->w=vd->hdrwidth; headerframe->h=vd->hdrheight;
headerframe->size= ((jpegsize<0)? 0: jpegsize); headerframe->format=vd->formatln; headerframe->nbframe=frame++; pthread_mutex_unlock (&vd->grabmutex); /*截取视频帧*/
if((ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<0){ perror (―cmcapture‖);
if (debug) printf (―>>cmcapture err \\n‖); erreur=-l ;}
vd->vmmap.frame= (vd->vmmap.frame+1) %vd->videombuf.frames; vd->frame_cour= (vd->frame_cour+l) %OUT FRMNUMB; (2)直接读取方式
直接读取视频数据是通过read系统调用函数来实现。read是一个用来从指定的文件或设备中读取数据的系统调用。参数表为read(fd,(void*)pFramebuff,(size_t) framesizeln)。其中fd为文件描述符,pFramebuffer为指向存放数据的内存的指针,framesizeln为需要读取的数据的长度。对于摄像头设备的读取,需要先分配内存空间,用来存储从摄像头读取过来的视频数据,然后直接调用read系统调用读取视频数据,返回值为实际读取的视频帧大小,也正是在视频传输过程中发送的视频数据大小。
size=vd->framesizeln;
vd->pFramebuffer= (unsigned char*) realloc (vd->pFramebuffer, (size_t) size); Len=read (vd->fd, vd->pFramebuffer, size); if (len<0) {
if (debug) printf (―v41 read error\\n‖);
if (debug) printf (―len %d asked %d\\n‖, len, size); return 0 ;}
/*是否有其他进程正在使用该视频帧*/
- 32 -
headerframe->deltatimes= (int) (headerframe->seqtimes-timecourant);
东北大学本科毕业设计(论文) 第5章 视频采集功能的设计
while ((vd->framelock [vd->frame_cour]! =0) &&vd->signalquit) usleep (1000); temps=ms_time ();
jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(structframe_t),vd->pFramebuffer,vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeln);
headerframe= (struct frame_t*) vd->ptframe [vd->frame_cour]; snprintf (headerframe->header, 5,‖%s‖,‖SPCA‖); headerframe->seqtimes=ms_time ();
headerframe->deltatimes= (int) (headerframe->seqtimes-timecourant); headerframe->w=vd->hdrwidth; headerframe->h=vd->hdrheight;
headerframe->size= ((jpegsize<0)? 0: jpegsize); headerframe->format=vd->formatln; headerframe->nbframe=frame++;
vd->frame_cour= (vd->frame_cour+1) %OUTFRMNUMB; pthread_mutex_unlock (&vd->grabmutex);
pthread_mutex_lock (&vd->grabmutex);
5.2 图像编解码 5.2.1 编解码介绍
通过摄像头采集到数据后,还并不能把它们直接通过网卡传输,因为这样的数据很大,网络不能承担如此庞大的数据传输。所以,必须将采集到得数据进行编码,压缩数据大小。通过这样的操作,我们采集到得数据就会变得很小,然后再把这些数据通过网络传输。同样的道理,在输出端我们还要把接收到的已经压缩的数据还原回来,这就涉及到解码的内容。通过这一系列的操作,图像和视频数据就实现的远程的传输。如果没有编解码,远程传输就是实际上不可能的事情,所以图像的编解码是非常重要的。
现在普遍使用的编解码技术。对于静态图像,普遍使用静态压缩JPEG标准;对于动态视频,普遍使用动态压缩MPEG标准。
JPEG是由ISO和CCITT为静态图像压缩所建立的国际上第一个静态图像压缩标准,JPEG有着较高的压缩比,复杂度适中,既可以用硬件实现,也可以用软件实现,实用性强,被广泛使用于计算机和通信行业。
- 33 -
东北大学本科毕业设计(论文) 第5章 视频采集功能的设计
MPEG中文译名为动态图像专家组。到目前为止,MPEG标准主要有五个,MPEG-1、MPEG-2、MPEG-4、MPEG-7和MPEG-21。它是由ISO/IEC1172压缩编码标准得出的视频压缩格式,MPEG的出现使视听传播进入数码化时代。MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减少时间冗余度,利用DCT技术以减少图像的空间冗余度,利用熵编码技术在信息表示方面减少了统计冗余度。通过一系列技术,极大的体现了压缩性能
[16]
。
5.2.2 系统压缩技术
由于本系统要求实现远程视频传输,为了达到预计的设计要求,设计采用基于MJPEG算法的压缩技术进行视频压缩。MJPEG和MPEG的不同点在于MJPEG不使用帧间编码。可是MJPEG与MPEG仍然是一脉相承的,它对MEPG进行了一些改进和发展,功能更加强大,能发送高质图片、清晰视频,编码容易实现。但MJPEG也有一些缺点,由于功能的提升,MJPEG对带宽的要求很高,编码效率低。
5.3 SOCKET简介
Socket是一种网络接口,可以把它看成网络的表现形式。网络终端可以通过Socket对网络进行I/O操作。所以,Linux就可以通过Socket实现进程或者网络之间的通信。
Socket有三个要素:网域、类型、规程。网域表明一个插口是用于哪一种网络,类型表明网络中通信所遵循的模式,有面向连接的和无连接的两种模式。例如TCP/IP协议要求面向连接的模式,有客户端和服务器两个进程,首先启动服务器,在它执行完accept()调用后,进入等待状态,接受客户端请求。否则将连接不成功。
TCP/IP的Socket编程有三种套接字:流式套接字、数据报式套接字和原始式套接字。本系统传输中采用的是流式套接字,其中主要的函数有创建套接字的socket()、指定本地地址的bind()、建立连接的connect()和accept()、监听连接的listen()、负责数据传输的send()和recv()、负责复用的select()和关闭套接字的closesocket()[17]。
- 34 -
东北大学本科毕业设计(论文) 第5章 视频采集功能的设计
- 35 -
共分享92篇相关文档