基于ARM11+Linux的无线视频监控系统
据,因为H264 解码时,对于P 帧需要参考前面一个关键帧或P 帧,而B帧需要参考前后帧,因此需要存放原始数据,首先,用avpicture_get_size 来获得需要的大小,然后调用av_malloc 函数申请内存空间。
(8) 通过调用avpicture_fill 函数将帧和新申请的内存结合起来。
(9) 创建格式转换上下文,通过img_convert_ctx=sws _getContext(src_w, src_h,src_pix_fmt, dst_w, dst_h,PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL,NULL)方法实现。其中,src_w 表示源图像的宽度,src_h 表示源图像的高度,src_pix_fmt 表示源图像的格式,dst_w 表示目标图像的宽度,dst_h 表示目标图像的高度,PIX_FMT_RGB24 表示目标图像的格式。
4.2.2 对数据进行H264 解码
(1) 获得需要解码的一帧数据,由于前面接收端线程已经把接收到的数据存放在一个指针数组中,因此,解码线程只需要从指针数据中获取数据即可。
(2) 解码数据。调用解码函数avcodec_ decode_video(pCodecCtx , pFrame , &finished , encodedData,size)来解码视频文件。其中,参数pCodecCtx是前面得到视频流编码上下文的指针;参数pFrame存储解码后的图片的位置,参数finished 用来记录已完成的帧数;参数encodedData 是输入缓冲区指针,指向要解码的原始数据;参数size 是输入缓冲区的大小。
(3) 将已解码的视频数据YUV420 格式转换成RGB 格式,通过调用sws_scale()函数实现格式转换。
4.2.3 视频数据的显示
本系统使用QT 下的QImage 显示视频数据,由于QImage 能够存取单个像素,这样在显示前一帧图像的时候,将该图像保存下来,当显示后一帧图像的时候,如果该像素值与前一帧相同,则不必修改该值,从而节省了大量的时间,即哪里变修改哪里,显示过程的具体步骤如下:
(1) 取得已解码的视频数据,且该数据是RGB 格式的。
(2) 循环取得视频数据的R 分量、G 分量、B 分量。
(3) 判断该点的像素值是否与前一帧对应位置的像素值相同,若相同,跳转到第2 步,否则,保存该像素值。
(4) 对取得的RGB 各自分量,构造该像素点的颜色值,通过调用qRGB(R,G,B)构造方法实现。
(5) 设置相应点的像素值,首先生成QImage 类的对象,然后调用该类的setPixel(x,y,rgb)。其中,x 是图像的x 坐标值,y 是图像的y 坐标值,rgb 是该点的颜色值。
(6) 显示图像,通过调用update()方法,该方法会触发绘画事件,因此,在绘画事件里,写入显示图像代码,即可显示刚生成的QImage 对象,通过调用drawImage()方法绘制图像。
5 结论
本系统在视频图像采集时,为了降低数据量,采用YUV420 的采样格式。视频数据编码采用H264 硬编码方式,极大地提高了编码速度。而在无线网络传输时,考虑到丢包问题,将编码数据进行拆包然后发送,降低了丢包率。经测试,本系统采集一幅OV9650摄像头拍摄的且分辨率为320X240 的图像,经H264硬编码,编码后的图像数据大致为5KB 左右,降低了数据传输量,并且硬编码每秒可编码25 帧图像数据,达到实时视频数据编码的要求。对于WI-FI 无线网络的传输率一般在11-54Mbps 左右,因此,该无线网络可以满足实时传输视频的需求。本系统构建了高实时性,低成本,低功耗的数字化无线视频监控平台,在该平台基础上,可以搭建各种各样的应用,比如,路况实时监控,人脸识别,仓库报警等应用,该系统具有一定的实用价值。
- 在Linux下使用ADSL(01-26)
- 使用 ADSL 动态 IP 建置虚拟主机(01-26)
- 做个ADSL+LINUX软路由器(01-26)
- 在嵌入式Linux实现802.11b无线网关(03-02)
- 如何保证Linux操作系统下的密码安全 (04-28)
- 在Linux系统下优化Oracle具体步骤(05-01)