基于motion的视频压缩的实时监控系统
项目说明:监控报警系统
涉及到的技术:
1.OSS/ALSA 声卡驱动的配置
2.Madplay嵌入式播放器移植
3.实现V4L2图像采集程序
4.移动监控主系统motion的移植
5.移植嵌入式web服务器boa
遇到的问题:
在移植madplay的时候,提示找不到madplay。
解决的办法:
通过arm-linux-readelf -d madplay 命令查看madplay需要的动态库,然后在/lib里找是否有这几个动态库。将缺少的动态库拷贝到linux系统的/lib下。
(madplay 播放器程序依赖于 zlib libid3tag libmad 这三个库,编译、安装三个库之后要将生成的动态库拷贝到linux系统中的/lib下。)
V4L2工作流程:打开设备->检查和设置设备属性->设置帧格式->设置一种输入输出方法(缓冲区管理)->循环获取数据->关闭设备。
应用程序通过V4L2接口采集视频数据分为5个步骤:
1.打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式。
2.申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间(使用mmap函数将申请的缓冲帧映射到应用程序),便于应用程序读取/处理视频数据。
3.将申请到的帧缓冲区在视频采集输入队列排队、并启动视频采集。
4.驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据。
5.停止视频采集
enum v4l2_buf_tpye *type
检查和设置设备属性:ioctl(intfd,VIDIOC_QUERYCAP,struct v4l2_capability *argp)
设置帧格式:ioctl(intfd,VIDIOC_S_FMT,struct v4l2_format *argp)
申请缓冲区:ioctl(intfd,VIDIOC_REQBUFS,struct v4l2_requestbuffers *argp)
将帧缓冲全部放入到输出队列中:ioctl(intfd,VIDIOC_QBUF,&buf)
从缓冲区中取出一个帧:ioctl(intfd,VIDIOC_DQBUF,&buf)
开始视频流数据的采集:ioctl(intfd,VIDIOC_STREAMON,&enum v4l2_buf_tpye *type)
停止视频的采集;ioctl(intfd,VIDIOC_STREAMOFF,enum v4l2_buf_tpye *type)