本站小编为你精心准备了无线视频传输系统的设计参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。
《无线通信技术杂志》2014年第二期
1视频数据的采集和编码
1.1基于V4L2的视频数据采集设计V4L2(VideoforLinuxTwo)是V4L的改进版,V4L2改进了V4L中的不足,具有更好的扩展性和灵活性,并且支持的硬件设备更多。利用V4L2接口函数获取视频帧数据有3种方式:read、write方式,用户指针方式,内存映射mmap方式。本系统通过内存映射方式采集,采用这种方法不仅读取方便,而且省去了大量的内存拷贝,效率较高[8]。视频采集过程如图3。(1)打开视频设备文件。fd=open(Device-name,mode);第一个参数是注册在/dev/目录下的设备名,打开模式可分为阻塞和非阻塞模式。(2)获取设备属性。调用函数ioctl(fd,VIDIOC_QUERYCAP,&cp)获取打开设备文件的相关参数并存放到cap结构中。(3)设置视频的制式和帧格式。调用函数ioctl(fd,VIDIOCS_FMT,&fmt)设置捕获图像的存储格式、宽带、高度、像素大小等。(4)申请帧缓冲区,并进行内存映射。调用函数ioctl(fd,VIDIOC_REQBUFS,&req)向内核申请req.count个帧缓存。通过VIDIOC_QUERBUF获取缓存帧在内核空间的地址,通过mmap方式将内核空间中的内存映射到用户空间。(5)采集视频数据。调用函数ioctl(fd,VIDIOC_STREAMON,&type)将数据存放到缓存中。(6)处理采集的数据。当应用程序将最先采到的一帧数据取走时,帧缓冲重新放入队列尾,从而循环采集数据。(7)关闭视频设备。调用close(fp)实现设备的关闭。
1.2基于MFC的H.264编码设计本系统利用S3C6410提供的MFC硬件编解码器实现了H.264标准的视频压缩。硬编码具有不占用CPU资源,运算速度快等优点,从而满足视频数据实时性的要求。H.264编码器要求输入数据为YUV420格式,而V4L2输出的视频数据是YUV422格式,因此在完成编码工作之前,要利用函数DoConvert()将YUV422格式转换为YUV420格式。编码的过程如图4。(1)创建H.264编码器。调用函数Ssb-SipH264EncodeInit(width,height,frame_rate,bitrate,gop_num)实现。(2)设置编码器参数,初始化H.264编码器,分别调用函数SsbSipH264EncodeSetConfig(handle,type,value)和函数SsbSipH264EncodeExe(handle)来实现。(3)获取要编码的视频数据的输入缓冲区地址,调用SsbSipH264EncodeGetInBuf(handle,0)来实现,该函数返回视频数据的输入地址。(4)读取要编码的视频数据,调用函数memcpy(p_inbuf,in_addr,frame_size)将需要编码的视频数据复制到上一步骤的输入缓冲区中。(5)编码视频数据,调用函数Ssb-SipH264EncodeExe(handle)实现H.264编码。(6)输出已编码的视频数据,调用函数Ssb-SipH264EncodeGetOutBuf(handle,size)获取编码后数据的输出缓冲区和编码数据大小。(7)关闭设备,调用函数Ssb-SipH264EncodeDeInit(handle)释放编码器资源,并且关闭MFC设备。图4H.264编码流程图
2视频数据的传输
2.1基于RTP/RTCP的流媒体实时传输设计为满足视频监控实时性的要求,需要RTCP(实时传输控制协议)和RTP(实时传输协议)协同使用,以有效的反馈和最小的开销使传输效果达到最好。RTP负责实时性传输,但它本身不提供QoS,需要RTCP提供视频质量控制的手段和方法。而控制RTP包的发送则通过RTSP协议完成。
2.1.1live555简介本系统利用开源Live555库实现了基于RTP、RTCP的实时传输。Live555库是一种为流媒体传输提供解决方案的跨平台C++开源项目,在嵌入式环境中运行稳定,性能较好,支持RTP/RTCP/RTSP/SDP等协议,支持多种音视频编码格式(如H.264、MPEG4、JPEG、DV等)的音视频数据的发送、接收和处理。Live555包含四个基本的库分别是BasicUsageEnvironment&TaskScheduler、UsageEnvir-onment、GroupSock和LiveMedia。LiveMedia模块是最重要的模块,基类是Medium,其它所有类都派生自该类[9]。
2.1.2基于Live555的流媒体服务器的设计针对Live555开源项目不支持H.264实时视频流的接收,我们继承FramedSource类写一个Camer-aH264StreamFramer类,这个类负责实时的采集视频图像,使用MFC进行H.264硬编码,然后覆盖成员函数doGetNextFrame()。H.264编码的每一帧交给VideoServerMediaSubsession处理。另外,还需要继成OnDemandServerMediaSubses-sion类,写一个H264LiveVideoServerMediaSubsession类,这个类负责管理Source和Sink,指示输入和输出。函数createNewStreamSource返回了实例化的CameraH264StreamFramer;函数createNewRTPSink返回了实例化的H264VideoRTPSink,其父类为RTP-Sink,这个类的作用是把原始的H264流封装成RTP数据包[10-12]。类结构图如图5:
2.1.3流媒体主程序设计流媒体主程序步骤如下:(1)构造应用程序环境类:包括任务调度器TaskScheduler,构造UsageEnviRonment对象的时候需要TaskScheduler作参数。(2)构造RTSPServer对象,代表整个流媒体VideoServer,配置监听端口,这里设置为8554,可以选择是否使用用户名密码方式访问。(3)构造MediaSession对象和MediaSubsession对象,表示具体的输入视频流和输出流。MediaSub-session就是我们构造的H264LiveVideoServerMediaSubsession。(4)把MediaSession加入到RTSPServer,调用RTSPServer的doEventLoop进入消息循环,开始监听用户请求接入,处理消息请求。图5类结构图图6视频监控效果图
2.23G模块联网3G模块与ARM是通过USB相连的。3G网络的连接是通过点对点(PPP)协议来完成的,PPP是在串行连接的数据链路实现IP以及其它网络协议的一种机制[13]。在Linux内核中已经添加了3G模块的驱动和PPP协议的支持,还需要移植相应的拨号软件实现拨号上网。本文选择拨号软件pppd,下载ppp-2.
2.4源码包,进行交叉编译生成拨号所需的应用程序pppd和chat,将这两个应用程序拷贝到开发板/usr/sbin文件夹下,更改其属性为可执行文件。配置好拨号的脚本文件后,通过pppdcall命令即可实现WCDMA无线网络的接入。通过AT指令对视频数据进行UDP打包,最终将视频数据包发送到3G网络上。
3终端设备
在Window平台下,用VLC播放器可以接收传输过来的视频流。如果终端设备IP:221.6.52.114,在VLC的地址栏输入rtsp://221.6.52.114:8554/live就可以播放流媒体视频。运行效果如图6。
4结束语
经测试,本系统采集分辨率为320*240的图像,经H.264硬编码后,每帧图像大小只有5KB左右,帧率可达25f/s。对于WCDMA无线网络的传输率一般在2Mbit/s左右,因此,该无线网络能够满足实时视频传输的需求。本文设计的视频传输系统结合了嵌入式技术﹑视频压缩编码技术﹑流媒体实时传输技术、无线通信技术等多项技术,系统具有实时性好、稳定性高、低成本、低功耗等优点,有很高的应用价值和较为广阔的市场前景。
作者:陈岚 鲍可进单位:江苏大学计算机科学与通信工程学院