基于ARM的远程视频监控系统.docx
- 文档编号:10965153
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:16
- 大小:99.44KB
基于ARM的远程视频监控系统.docx
《基于ARM的远程视频监控系统.docx》由会员分享,可在线阅读,更多相关《基于ARM的远程视频监控系统.docx(16页珍藏版)》请在冰豆网上搜索。
基于ARM的远程视频监控系统
系统组成:
USB视频采集模块、数据处理模块、视频播放模块。
其中USB视频采集模块要解决两个问题,一个是摄像头驱动问题,另一个就是怎么样用v4l采集数据的问题。
数据处理模块最主要就是把采集到的每一帧图像数据进行压缩,以节省网络带宽。
视频播放模块主要就是客户段软件的实现,它通过网络接收数据,解压后进行播放。
系统框架图如下:
系统工作流程:
实现好摄像头驱动后,用v4l接口从摄像头中读取视频数据;调用H.264编码库对数据进行编码,然后通过socket发给客户端;客户端接收数据,进行解码,最后显示出来。
系统软硬件环境:
宿主机:
LenovoPC,Ubuntu10.10
FL2440开发板:
S3C2440,Linux-2.6.12
摄像头:
中星微ZC0301PH,驱动为gspca?
编解码库:
t264
实现步骤:
1.编译摄像头驱动:
进入摄像头驱动源码目录,修改Makefile文件,主要是改动CC=arm-linux-gcc,KERNELDIR=YourKernelDir,然后make,就会产生gspca.ko这个模块。
2.交叉编译H.264源码:
进入源码目录,修改Makefile文件:
CC=arm-linux-gcc即可。
3.编译服务端软件,源码下附,Makefile中要指明H.264的头文件路径还有上一步产生的库文件路径。
4.测试,insmodgspca.ko,运行./camera_server。
效果如下:
附camera_server.c源码:
viewplaincopytoclipboardprint?
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#include
9.#include
10.#include
11.#include
12.#include
13.#include
14.#include
15.#include
16.#include
17.#include "convert.h"
18.
19.#include "/paul/Tools/Lib/avc/common/T264.h"
20.
21.#define SERVER_PORT 8888
22.
23.T264_t* m_t264;
24.T264_param_t m_param;
25.char* m_pSrc;
26.char* m_pDst;
27.int* m_lDstSize;
28.char* m_pPoolData;
29.
30.#define USB_VIDEO "/dev/video0"
31.int cam_fd;
32.struct video_mmap cam_mm;
33.struct video_capability cam_cap;
34.struct video_picture cam_pic;
35.struct video_mbuf cam_mbuf;
36.struct video_window win;
37.char *cam_data = NULL;
38.int nframe;
39.static unsigned char cam_yuv[2457616];
40.
41.void read_video(char *pixels,int w, int h)
42.{
43. int ret;
44. int frame=0;
45.
46. cam_mm.width = w;
47. cam_mm.height = h;
48. cam_mm.frame = 0;
49. cam_mm.format=VIDEO_PALETTE_RGB24; // Our camera support RGB24
50.
51. /* Read data */
52. ret = ioctl(cam_fd,VIDIOCMCAPTURE,&cam_mm);
53. if( ret<0 ) {
54. printf("ERROR:
VIDIOCMCAPTURE\n");
55. }
56.
57. /* Wait until all data is read. */
58. ret = ioctl(cam_fd,VIDIOCSYNC,&frame);
59. if( ret<0 ) {
60. printf("ERROR:
VIDIOCSYNC\n");
61. }
62.}
63.
64./* Configure picture */
65.void config_vid_pic()
66.{
67. char cfpath[100];
68. FILE *cf;
69. int ret;
70.
71. if (ioctl(cam_fd, VIDIOCGPICT, &cam_pic) < 0) {
72. printf("ERROR:
VIDIOCGPICT\n");
73. }
74. cam_pic.palette = VIDEO_PALETTE_RGB24;
75. cam_pic.brightness = 30464;
76. cam_pic.hue = 111;
77. cam_pic.colour = 555;
78. cam_pic.contrast = 43312;
79. cam_pic.whiteness = 111;
80. cam_pic.depth = 24;
81. ret = ioctl( cam_fd, VIDIOCSPICT,&cam_pic );
82.
83. if( ret<0 ) {
84. close(cam_fd);
85. printf("ERROR:
VIDIOCSPICT,Can't set video_picture format\n");
86. }
87.
88. return;
89.}
90.
91.void init_video(int w,int h)
92.{
93. int ret;
94.
95. /* Open the device */
96. cam_fd = open( USB_VIDEO, O_RDWR );
97. if( cam_fd<0 )
98. printf("Can't open video device\n");
99.
100. /* Get info */
101. ret = ioctl( cam_fd,VIDIOCGCAP,&cam_cap );
102. if( ret<0 ) {
103. printf("Can't get device information:
VIDIOCGCAP\n");
104. }
105. printf("Device name:
%s\nWidth:
%d ~ %d\nHeight:
%d ~ %d\n",
106. cam_cap.name,
107. cam_cap.maxwidth,
108. cam_cap.minwidth,
109. cam_cap.maxheight,
110. cam_cap.minheight);
111.
112. if( ioctl(cam_fd,VIDIOCGWIN,&win)<0 ) {
113. printf("ERROR:
VIDIOCGWIN\n");
114. }
115. win.x = 0;
116. win.y = 0;
117. win.width=w;
118. win.height=h;
119.
120. /* Set Window */
121. if (ioctl(cam_fd, VIDIOCSWIN, &win) < 0) {
122. printf("ERROR:
VIDIOCSWIN\n");
123. }
124.
125. config_vid_pic();
126.
127. /* Get device buffer */
128. ret = ioctl(cam_fd,VIDIOCGMBUF,&cam_mbuf);
129. if( ret<0 ) {
130. printf("ERROR:
VIDIOCGMBUF,Can't get video_mbuf\n");
131. }
132. printf("Frames:
%d\n",cam_mbuf.frames);
133. nframe = cam_mbuf.frames;
134.
135. /* Memory map */
136. cam_data = (char*)mmap(0, cam_mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED,cam_fd,0);
137. if( cam_data == MAP_FAILED ) {
138. printf("ERROR:
mmap\n");
139. }
140. printf("Buffer size:
%d\nOffset:
%d\n",cam_mbuf.size, cam_mbuf.offsets[0]);
141. InitLookupTable();
142.}
143.
144./* This function is from the example T264.c.
145. * It initialize the encode with parameters from the configure file.
146. * You don't need to know the great detail.
147. */
148.void init_param(T264_param_t* param, const char* file)
149.{
150. int total_no;
151. FILE* fd;
152. char line[255];
153. int32_t b;
154. if (!
(fd = fopen(file,"r")))
155. {
156. printf("Couldn't open parameter file %s.\n", file);
157. exit(-1);
158. }
159.
160. memset(param, 0, sizeof(*param));
161. fgets(line, 254, fd); sscanf(line,"%d", &b);
162. if (b !
= 4)
163. {
164. printf("wrong param file version, expect v4.0\n");
165. exit(-1);
166. }
167. fgets(line, 254, fd); sscanf(line,"%d", ¶m->width);
168. fgets(line, 254, fd); sscanf(line,"%d", ¶m->height);
169. fgets(line, 254, fd); sscanf(line,"%d", ¶m->search_x);
170. fgets(line, 254, fd); sscanf(line,"%d", ¶m->search_y);
171. fgets(line, 254, fd); sscanf(line,"%d", &total_no);
172. fgets(line, 254, fd); sscanf(line,"%d", ¶m->iframe);
173. fgets(line, 254, fd); sscanf(line,"%d", ¶m->idrframe);
174. fgets(line, 254, fd); sscanf(line,"%d", ¶m->b_num);
175. fgets(line, 254, fd); sscanf(line,"%d", ¶m->ref_num);
176. fgets(line, 254, fd); sscanf(line,"%d", ¶m->enable_rc);
177. fgets(line, 254, fd); sscanf(line,"%d", ¶m->bitrate);
178. fgets(line, 254, fd); sscanf(line,"%f", ¶m->framerate);
179. fgets(line, 254, fd); sscanf(line,"%d", ¶m->qp);
180. fgets(line, 254, fd); sscanf(line,"%d", ¶m->min_qp);
181. fgets(line, 254, fd); sscanf(line,"%d", ¶m->max_qp);
182. fgets(line, 254, fd); sscanf(line,"%d", ¶m->enable_stat);
183. fgets(line, 254, fd); sscanf(line,"%d", ¶m->disable_filter);
184. fgets(line, 254, fd); sscanf(line,"%d", ¶m->aspect_ratio);
185. fgets(line, 254, fd); sscanf(line,"%d", ¶m->video_format);
186. fgets(line, 254, fd); sscanf(line,"%d", ¶m->luma_coeff_cost);
187. fgets(line, 254, fd); sscanf(line,"%d", &b);
188. param->flags |= (USE_INTRA16x16) * (!
!
b);
189. fgets(line, 254, fd); sscanf(line,"%d", &b);
190. param->flags |= (USE_INTRA4x4) * (!
!
b);
191. fgets(line, 254, fd); sscanf(line,"%d", &b);
192. param->flags |= (USE_INTRAININTER) * (!
!
b);
193. fgets(line, 254, fd); sscanf(line,"%d", &b);
194. param->flags |= (USE_HALFPEL) * (!
!
b);
195. fgets(line, 254, fd); sscanf(line,"%d", &b);
196. param->flags |= (USE_QUARTPEL) * (!
!
b);
197. fgets(line, 254, fd); sscanf(line,"%d", &b);
198. param->flags |= (USE_SUBBLOCK) * (!
!
b);
199. fgets(line, 254, fd); sscanf(line,"%d", &b);
200. param->flags |= (USE_FULLSEARCH) * (!
!
b);
201. fgets(line, 254, fd); sscanf(line,"%d", &b);
202. param->flags |= (USE_DIAMONDSEACH) * (!
!
b);
203. fgets(line, 254, fd); sscanf(line,"%d", &b);
204. param->flags |= (USE_FORCEBLOCKSIZE) * (!
!
b);
205. fgets(line, 254, fd); sscanf(line,"%d", &b);
206. param->flags |= (USE_FASTINTERPOLATE) * (!
!
b);
207. fgets(line, 254, fd); sscanf(line,"%d", &b);
208. param->flags |= (USE_SAD) * b;
209. fgets(line, 254, fd); sscanf(line,"%d", &b);
210. param->flags |= (USE_EXTRASUBPELSEARCH) * (!
!
b);
211. fgets(line, 254, fd); sscanf(line,"%d", &b);
212. param->flags |= (USE_SCENEDETECT) * (!
!
b);
213. fgets(line, 254, fd); sscanf(line,"%d", &b);
214. param->block_size |= (SEARCH_16x16P) * (!
!
b);
215. fgets(line, 254, fd); sscanf(line,"%d", &b);
216. param->block_size |= (SEARCH_16x8P) * (!
!
b);
217. fgets(line, 254, fd); sscanf(line,"%d", &b);
218. param->block_size |= (SEARCH_8x16P) * (!
!
b);
219. fgets(line, 254, fd); sscanf(line,"%d", &b);
220. param->block_size |= (SEARCH_8x8P) * (!
!
b);
221. fgets(line, 254, fd); sscanf(line,"%d", &b);
222. param->block_size |= (SEARCH_8x4P) * (!
!
b);
223. fgets(line, 254, fd); sscanf(line,"%d", &b);
224. param->block_size |= (SEARCH_4x8P) * (!
!
b);
225. fgets(line, 254, fd); sscanf(line,"%d", &b);
226. param->block_size |= (SEARCH_4x4P) * (!
!
b);
227. fgets(line, 254, fd); sscanf(line,"%d", &b);
228. param->block_size |= (SEARCH_16x16B) * (!
!
b);
229. fgets(line, 254, fd); sscanf(line,"%d", &b);
230. param->block_size |= (SEARCH_16x8B) * (!
!
b);
231. fgets(line, 254, fd); sscanf(line,"%d", &b);
232. param->block_size |= (SEARCH_8x16B) * (!
!
b);
233. fgets(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM 远程 视频 监控 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)