基于ARM11的无线视频监控系统
ncodeGetInBuf (handle, 0)函数来实现,该函数返回视频输入的首地址,存放在p_inbuf 中。
(4)输入视频数据,调用memcpy(p_inbuf, yuv_buf, frame_size)函数实现,p_inbuf 存放需要编码的数据,yuv_buf 存放原始视频数据,frame_size 表示数据的大小。
(5)编码视频数据,对p_inbuf 内容进行H264编码,调用SsbSipH264EncodeExe(handle)函数实现。
(6)输出已编码的数据,SsbSipH264EncodeGetOutBuf (handle, size),该函数返回已编码图像的首地址,size 表示已编码图像的大小。
(7)关闭硬编码设备,调用SsbSipH264EncodeDeInit (handle)函数实现的。
图3 H264 编码流程框图。
4 视频数据的传输和显示
4.1 视频数据传输模块设计
现代无线通信网络标准主要有3G(第三代移动通信),WI-FI,Bluetooth,Zigbee(紫蜂)等,具体详见表1.
表1 常用无线通信网络标准的基本比较
由于WI-FI 具有传输率高,支持的协议多,安装及设置简单,成本低等优点,所以本系统采用的无线网络标准是WI-FI.
4.1.1 WI-FI 无线网络搭建过程
(1)加载WI-FI 模块。通过insmod 命令加载,这里需要加载2 个文件helper_sd.bin、sd8686.bin,这2 个文件可以从Marvel 官方网站下载。
(2)搜索WI-FI 网络。先用ifconfig eth1 up 命令把WI-FI 网络接口卡打开,然后用iwlist eth1 scanning命令搜索WIFI 网络。
(3)设置eth1 的ip 地址和子网掩码。
(4)设置ESSID.通过iwconfig eth1 essid 402命令实现的,ESSID 用来区分不同的网络。
(5)设置密码。通过iwconfig eth1 key s:your_key命令实现的,其中your_key 就是登陆密码。
4.1.2 基于RTP 协议的视频数据传输
RTP 是实时传送协议( Real-time TransportProtocol)的缩写,代表一个网络传输的协议,为音频、视频上传中的常用协议[5].RTCP 和RTP 一起提供流量控制和拥塞控制服务,它们能以有效反馈和最小开销使传输效率最佳化,因而特别适合传送实时的数据,所以采用该协议传输视频数据。
本系统采用开源代码Jrtplib 提供的RTP 协议栈,由于Jrtplib 对RFC3550 的实现进行了封装,使得传输视频数据更加简单。由于本系统的网络最大有效载荷为1500 字节,因此设置RTP 包大小的上限为1400 字节,如果发送的数据大于1400 字节,则采用拆包的方法再发送,具体传输过程如图4 和图5 所示。
图4 发送端流程框图。
图5 接收端流程框图。
发送端主要过程如下:
(1)创建RTP 会话并设置目标地址。调用Create方法得到RTP 会话实例,然后调用AddDestination 方法设置目标IP 以及目标端口号。
(2)获得数据,调用Get_Data()函数得到。
(3)发送数据,通过SendPacket()方法实现。
接收端主要过程如下:
(1)创建RTP 会话。调用Create 方法来创建一个会话实例,并且在创建会话的同时设置端口号,要与发送端的端口号保持一致。
(2)接受RTP 数据。调用RTPSession 类的PollData()方法接收数据。
(3)保存RTP 数据报。通过创建了一个指针数组,里面存放的是RTP 数据报的指针,只要将刚接收到RTP 数据报的指针赋给这个指针数组即可,这样可以节省数据拷贝的时间。
(4)判断是否接收完成,如果没有,则跳转到第b 步,否则接收端程序退出。
4.2 视频数据的解码和显示
由于接收到的数据是经H264 编码的数据,因此,先要对该数据进行解码,然后才能显示。而在服务器端,对视频数据解码用到FFmpeg.FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件。
解码时主要涉及FFmpeg 下的libavcodec 库、libswscale库和libavformat 库,其中第一个库是一个包含了所有FFmpeg 音视频编解码器的库,第二个库是格式转化库,因为解码后的数据是YUV420 格式,而要在计算机上显示该数据,则需要的是RGB 格式的,该库功能就是把YUV420 格式转化成RGB 格式,第三个库是一个包含了所有的普通音视格式的解析器和产生器的库。
4.2.1 初始化解码线程
(1) 注册全部的文件格式和编解码器,调用av_register_all()函数完成注册。
(2) 设置AVFormatContext 结构体。该结构体是FFmpeg 格式转换过程中实现输入和输出功能,保存相关数据的主要结构,通过av_open_input_file 函数设置该结构体。
(3) 检查视频流的信息,通过调用av_find_stream_info(pFormatCtx)函数,pFormatCtx->streams 就填充了正确的视频流信息,pFormatCtx 类型是AVFormatContext.
(4) 得到编解码器上下文,pCodecCtx= pFormatCtx -> streams[videoStream]->(4) 得到编解码器上下文,pCodecCtx= pFormatCtx -> streams[videoStream]->codec,pCodecCtx 指针指向了流中所
- TD-LTE多模基带平台ARM子系统的运行流程控制和异常定位分析(08-24)
- 基于ARM11的Linux NAND FLASH模拟U盘挂载分析(11-25)
- ARM系列微处理器简介之:ARM芯片的特点与选型(08-13)
- 基于ARM11和DSP协作视频流处理技术的3G视频安全帽设计(01-14)
- ARM11后现代时:Cortex开枝散叶(06-04)
- Eclipse在线调试ARM11——Tiny6410+OpenJTAG(11-28)