1. usb摄像头驱动,h264编码库,采集read_video,传输,客户端显示组成
  2. 读取摄像头数据缓冲区是否有帧数据收到,有数据收到就读取数据并进行H264编码,把数据发送到socket发送到客户端。
  3. 配置内核:make menuconfig ARCH=arm, 选择gerneral setup-->multimedia devices-->device drivers-->multimedia devices-->video capture adapters-->V4L USB devices-->USB OV511 camera support
  4. 编译内核:make uImage ARCH=arm
  5. CROSS_COMPILE=arm-linux-
  6. uImage拷贝到tftpboot目录下
  7. 编译t264
  8. 编译server_arm
  9. 挂载文件系统
  10. 连接usb摄像头, 节点自动创建起来,ls -l /dev/video0, mknod /dev/video0 c
  11. ARM上运行视频采集和发送程序./server_arm fastspeed.txt
  12. PC端打开客户端LinuxClient.exe, 看到视频信息。
  13. 主要程序充server_arm.c
  14. /* 服务端程序 server.c */
  15. //WB
  16. #include <unistd.h>
  17. #include <sys/types.h>
  18. #include <sys/stat.h>
  19. #include <fcntl.h>
  20. #include <stdio.h>
  21. #include <sys/ioctl.h>
  22. #include <sys/mman.h>
  23. #include <stdlib.h>
  24. #include <linux/types.h>
  25. #include <linux/videodev.h>
  26. #include <setjmp.h>
  27. #include <string.h>
  28. #include <signal.h>
  29. #include <errno.h>
  30. #include <sys/socket.h>
  31. #include <netinet/in.h>
  32. #include "convert.h"
  33.  
  34. #include "../avc-src-0.14/avc/common/T264.h"
  35.  
  36. #define SERVER_PORT 8888
  37.  
  38. T264_t* m_t264;
  39. T264_param_t m_param;
  40. char* m_pSrc;
  41. char* m_pDst;
  42. int* m_lDstSize;
  43. char* m_pPoolData;
  44.  
  45. #define USB_VIDEO "/dev/video0"
  46. int cam_fd;
  47. struct video_mmap cam_mm;/*视频内存映射*/
  48. /*包含摄像头的基本信息,例如设备名称、
  49. 支持的最大最小分辨率、信号源信息等*/
  50. struct video_capability cam_cap;
  51. /*亮度、对比度等和voide_mmap中的分辨率*/
  52. struct video_picture cam_pic;
  53. struct video_mbuf cam_mbuf;/*摄像头存储缓冲区的帧信息*/
  54. struct video_window win;/* 设备采集窗口参数*/
  55. char *cam_data = NULL;
  56. int nframe;
  57.  
  58. void read_video(char *pixels,int w, int h)
  59. {
  60. int ret;
  61. ;
  62. cam_mm.width = w;
  63. cam_mm.height = h;
  64. /* 对于单帧采集只需设置 frame=0*/
  65. cam_mm.frame = ;
  66. cam_mm.format=VIDEO_PALETTE_YUV420P; //change by 091215
  67. /* 若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的*/
  68. ret = ioctl(cam_fd,VIDIOCMCAPTURE,&cam_mm);
  69. ) {
  70. printf("ERROR: VIDIOCMCAPTURE\n");
  71. }
  72. /* 函数判断该帧图像是否截取完毕,成功返回表示截取完毕*/
  73. ret = ioctl(cam_fd,VIDIOCSYNC,&frame);
  74. ) {
  75. printf("ERROR: VIDIOCSYNC\n");
  76. }
  77. }
  78.  
  79. void config_vid_pic()
  80. {
  81. ];
  82. FILE *cf;
  83. int ret;
  84. ) {
  85. printf("ERROR:VIDIOCGPICT\n");
  86. }
  87. /*图像采集格式,网眼V2000只支持VIDEO_PALETTE_YUV420P*/
  88. cam_pic.palette = VIDEO_PALETTE_YUV420P; //change by 091215
  89.  
  90. #if 0
  91. cam_pic.brightness = ;
  92. cam_pic.hue = ;
  93. cam_pic.colour = ;
  94. cam_pic.contrast = ;
  95. cam_pic.whiteness = ;
  96. cam_pic.depth = ;
  97. #endif
  98. cam_pic.brightness = ;
  99. cam_pic.hue = ;
  100. cam_pic.colour = ;
  101. cam_pic.contrast = ;
  102. cam_pic.whiteness = ;
  103. /*VIDEO_PALETTE_YUV420,bpp=12bit*/
  104. cam_pic.depth = ; //bpp == bytes per pixel,change by 091215
  105. /*设置摄像头缓冲中voideo_picture信息*/
  106. ret = ioctl( cam_fd, VIDIOCSPICT,&cam_pic );
  107.  
  108. ) {
  109. close(cam_fd);
  110. printf("ERROR: VIDIOCSPICT,Can't set video_picture format\n");
  111. }
  112. return;
  113. }
  114.  
  115. void init_video(int w,int h) /* bpp == bytes per pixel*/
  116. {
  117. int ret;
  118.  
  119. /*设备的打开*/
  120. cam_fd = open( USB_VIDEO, O_RDWR );
  121. )
  122. printf("Can't open video device\n");
  123. /* 使用IOCTL命令VIDIOCGCAP,获取摄像头的基本信息,如最大,最小分辨率*/
  124.  
  125. ret = ioctl( cam_fd,VIDIOCGCAP,&cam_cap ); /* 摄像头的基本信息*/
  126. ) {
  127. printf("Can't get device information: VIDIOCGCAP\n");
  128. }
  129. printf("Device name:%s\nWidth:%d ~ %d\nHeight:%d ~ %d\n",cam_cap.name, cam_cap.maxwidth, cam_cap.minwidth, cam_cap.maxheight, cam_cap.minheight);
  130. ) {
  131. printf("ERROR:VIDIOCGWIN\n");
  132. }
  133. win.x = ; //windows中的原点坐标
  134. win.y = ; //windows中的原点坐标
  135. win.width=w; //capture area 宽度
  136. win.height=h; //capture area 高度
  137.  
  138. /*使用IOCTL命令VIDIOCSWIN,设置摄像头的基本信息*/
  139. ) {
  140. printf("ERROR:VIDIOCSWIN\n");
  141. }
  142.  
  143. /*设置摄像头voideo_picture信息*/
  144. config_vid_pic();
  145.  
  146. /*使用IOCTL命令VIDIOCGCAP,获取获得摄像头存储缓冲区的帧信息*/
  147. ret = ioctl(cam_fd,VIDIOCGMBUF,&cam_mbuf);
  148. ) {
  149. printf("ERROR:VIDIOCGMBUF,Can't get video_mbuf\n");
  150. }
  151. printf("Frames:%d\n",cam_mbuf.frames);
  152. nframe = cam_mbuf.frames;
  153.  
  154. /*接着把摄像头对应的设备文件映射到内存区*/
  155. cam_data = (, cam_mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED,cam_fd,);
  156. if( cam_data == MAP_FAILED ) {
  157. printf("ERROR:mmap\n");
  158. }
  159. printf(]);
  160. InitLookupTable();
  161.  
  162. }
  163.  
  164. void init_param(T264_param_t* param, const char* file)
  165. {
  166. int total_no;
  167. FILE* fd;
  168. ];
  169. int32_t b;
  170. if (!(fd = fopen(file,"r")))
  171. {
  172. printf("Couldn't open parameter file %s.\n", file);
  173. exit(-);
  174. }
  175.  
  176. memset(param, , sizeof(*param));
  177. fgets(line, , fd); sscanf(line,"%d", &b);
  178. )
  179. {
  180. printf("wrong param file version, expect v4.0\n");
  181. exit(-);
  182. }
  183. fgets(line, , fd); sscanf(line,"%d", &param->width);
  184. fgets(line, , fd); sscanf(line,"%d", &param->height);
  185. fgets(line, , fd); sscanf(line,"%d", &param->search_x);
  186. fgets(line, , fd); sscanf(line,"%d", &param->search_y);
  187. fgets(line, , fd); sscanf(line,"%d", &total_no);
  188. fgets(line, , fd); sscanf(line,"%d", &param->iframe);
  189. fgets(line, , fd); sscanf(line,"%d", &param->idrframe);
  190. fgets(line, , fd); sscanf(line,"%d", &param->b_num);
  191. fgets(line, , fd); sscanf(line,"%d", &param->ref_num);
  192. fgets(line, , fd); sscanf(line,"%d", &param->enable_rc);
  193. fgets(line, , fd); sscanf(line,"%d", &param->bitrate);
  194. fgets(line, , fd); sscanf(line,"%f", &param->framerate);
  195. fgets(line, , fd); sscanf(line,"%d", &param->qp);
  196. fgets(line, , fd); sscanf(line,"%d", &param->min_qp);
  197. fgets(line, , fd); sscanf(line,"%d", &param->max_qp);
  198. fgets(line, , fd); sscanf(line,"%d", &param->enable_stat);
  199. fgets(line, , fd); sscanf(line,"%d", &param->disable_filter);
  200. fgets(line, , fd); sscanf(line,"%d", &param->aspect_ratio);
  201. fgets(line, , fd); sscanf(line,"%d", &param->video_format);
  202. fgets(line, , fd); sscanf(line,"%d", &param->luma_coeff_cost);
  203. fgets(line, , fd); sscanf(line,"%d", &b);
  204. param->flags |= (USE_INTRA16x16) * (!!b);
  205. fgets(line, , fd); sscanf(line,"%d", &b);
  206. param->flags |= (USE_INTRA4x4) * (!!b);
  207. fgets(line, , fd); sscanf(line,"%d", &b);
  208. param->flags |= (USE_INTRAININTER) * (!!b);
  209. fgets(line, , fd); sscanf(line,"%d", &b);
  210. param->flags |= (USE_HALFPEL) * (!!b);
  211. fgets(line, , fd); sscanf(line,"%d", &b);
  212. param->flags |= (USE_QUARTPEL) * (!!b);
  213. fgets(line, , fd); sscanf(line,"%d", &b);
  214. param->flags |= (USE_SUBBLOCK) * (!!b);
  215. fgets(line, , fd); sscanf(line,"%d", &b);
  216. param->flags |= (USE_FULLSEARCH) * (!!b);
  217. fgets(line, , fd); sscanf(line,"%d", &b);
  218. param->flags |= (USE_DIAMONDSEACH) * (!!b);
  219. fgets(line, , fd); sscanf(line,"%d", &b);
  220. param->flags |= (USE_FORCEBLOCKSIZE) * (!!b);
  221. fgets(line, , fd); sscanf(line,"%d", &b);
  222. param->flags |= (USE_FASTINTERPOLATE) * (!!b);
  223. fgets(line, , fd); sscanf(line,"%d", &b);
  224. param->flags |= (USE_SAD) * b;
  225. fgets(line, , fd); sscanf(line,"%d", &b);
  226. param->flags |= (USE_EXTRASUBPELSEARCH) * (!!b);
  227. fgets(line, , fd); sscanf(line,"%d", &b);
  228. param->flags |= (USE_SCENEDETECT) * (!!b);
  229. fgets(line, , fd); sscanf(line,"%d", &b);
  230. param->block_size |= (SEARCH_16x16P) * (!!b);
  231. fgets(line, , fd); sscanf(line,"%d", &b);
  232. param->block_size |= (SEARCH_16x8P) * (!!b);
  233. fgets(line, , fd); sscanf(line,"%d", &b);
  234. param->block_size |= (SEARCH_8x16P) * (!!b);
  235. fgets(line, , fd); sscanf(line,"%d", &b);
  236. param->block_size |= (SEARCH_8x8P) * (!!b);
  237. fgets(line, , fd); sscanf(line,"%d", &b);
  238. param->block_size |= (SEARCH_8x4P) * (!!b);
  239. fgets(line, , fd); sscanf(line,"%d", &b);
  240. param->block_size |= (SEARCH_4x8P) * (!!b);
  241. fgets(line, , fd); sscanf(line,"%d", &b);
  242. param->block_size |= (SEARCH_4x4P) * (!!b);
  243. fgets(line, , fd); sscanf(line,"%d", &b);
  244. param->block_size |= (SEARCH_16x16B) * (!!b);
  245. fgets(line, , fd); sscanf(line,"%d", &b);
  246. param->block_size |= (SEARCH_16x8B) * (!!b);
  247. fgets(line, , fd); sscanf(line,"%d", &b);
  248. param->block_size |= (SEARCH_8x16B) * (!!b);
  249. fgets(line, , fd); sscanf(line,"%d", &b);
  250. param->block_size |= (SEARCH_8x8B) * (!!b);
  251. fgets(line, , fd); sscanf(line,"%d", &param->cpu);
  252. fgets(line, , fd); sscanf(line, "%d", &param->cabac);
  253.  
  254. // fgets(line, 254, fd); sscanf(line,"%s", src_path);
  255. // fgets(line, 254, fd); sscanf(line,"%s", out_path);
  256. // fgets(line, 254, fd); sscanf(line,"%s", rec_path);
  257. // param->rec_name = rec_path;
  258.  
  259. fclose(fd);
  260. }
  261.  
  262. void init_encoder()
  263. {
  264. //编码准备
  265. const char* paramfile = "fastspeed.txt";
  266. /*获取fastspeed.txt文件信息*/
  267. init_param(&m_param, paramfile);
  268. m_param.direct_flag = ;
  269. /*t264编码的打开*/
  270. m_t264 = T264_open(&m_param);
  271. m_lDstSize = m_param.height * m_param.width + (m_param.height * m_param.width >> );
  272. /*分配t264解码后数据存放的内存*/
  273. m_pDst = (uint8_t*)T264_malloc(m_lDstSize, CACHE_SIZE);
  274.  
  275. /*分配内存用于存放一帧数据长度的数据*/
  276. m_pPoolData = malloc(m_param.width*m_param.height*/);
  277. }
  278.  
  279. void udps_respon(int sockfd,int w,int h)
  280. {
  281. struct sockaddr_in addrsrc;
  282. struct sockaddr_in addrdst;
  283. int addrlen,n;
  284.  
  285. int32_t iActualLen;
  286. *h/;
  287.  
  288. bzero(&addrdst,sizeof(struct sockaddr_in));
  289. addrdst.sin_family=AF_INET;
  290. /*客户端PC机IP地址*/
  291. addrdst.sin_addr.s_addr=inet_addr("172.18.23.26");
  292. addrdst.sin_port=htons(SERVER_PORT);
  293.  
  294. )
  295. {
  296. /*数据的采集*/
  297. read_video(NULL,w,h);
  298. /*对采集到的数据通过H264编码*/
  299. iActualLen = T264_encode(m_t264, cam_data, m_pDst, row_stride);
  300. printf("encoded:%d, %d bytes.\n",row_stride,iActualLen);
  301. /*frame_num:存放帧号*/
  302. memcpy(m_pPoolData,&m_t264->frame_num,);
  303. /*m_pDst解码后的数据*/
  304. memcpy(m_pPoolData+, m_pDst, iActualLen);
  305. iActualLen++;
  306. /*使用UDP协议发送编码后的数据到客服端*/
  307. sendto(sockfd,m_pPoolData,iActualLen,,(struct sockaddr*)&addrdst,sizeof(struct sockaddr_in));
  308. }
  309. }
  310.  
  311. void free_dev()
  312. {
  313. printf("free device\n");
  314. close(cam_fd);
  315. }
  316.  
  317. /*主函数入口*/
  318. int main(void)
  319. {
  320. int sockfd;
  321. struct sockaddr_in addr;
  322.  
  323. printf("start 2.0...\n");
  324.  
  325. /*创建套接字*/
  326. sockfd=socket(AF_INET,SOCK_DGRAM,);
  327.  
  328. )
  329. {
  330. printf("0-");
  331. printf("Socket Error\n");
  332. exit();
  333. }
  334.  
  335. bzero(&addr,sizeof(struct sockaddr_in));
  336. addr.sin_family=AF_INET;
  337. addr.sin_addr.s_addr=htonl(INADDR_ANY);
  338. addr.sin_port=htons(SERVER_PORT);
  339. /*套接字绑定*/
  340. )
  341. {
  342. printf(stderr,"Bind Error:%s\n",strerror(errno));
  343. exit();
  344. }
  345.  
  346. /*该函数完成编码前的准备*/
  347. init_encoder();
  348.  
  349. atexit( &free_dev );
  350. /*采集数据前的初始化函数*/
  351. init_video(m_param.width,m_param.height);
  352.  
  353. /*使用UDP协议发送采集到的数据*/
  354. udps_respon(sockfd,m_param.width,m_param.height);
  355.  
  356. close(sockfd);
  357.  
  358. }

H.264远程视频监控系统的更多相关文章

  1. 如何利用SimpleNVR建立全天候远程视频监控系统

    随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...

  2. 基于Android的远程视频监控系统(含源码)

    基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...

  3. 嵌入式应用开发第四阶段-基于rk3399的视频监控系统

    一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...

  4. Python远程视频监控

    Python远程视频监控程序   老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...

  5. VSAM:视频监控系统 A System for Video Surveillance and Monitoring

    VSAM(VideoSurveillance and Monitoring)视频监控系统 Robotics Institute CMU 1:引言 2:试验床介绍 3:基本的视频分析算法:运动目标检测, ...

  6. Qt编写安防视频监控系统9-自动隐藏光标

    一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...

  7. Qt编写安防视频监控系统5-视频回放

    一.前言 一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK来做兼容处理,烦得很,厂家越来 ...

  8. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾 ...

  9. 基于.NET打造IP智能网络视频监控系统

    开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码   开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献:基于.NET打造 ...

随机推荐

  1. out与ref修饰符

    out修饰符 定义 作用 使用注意 总结 定义 out意为output,所以被out修饰的参数叫做输出参数. 通过使用out修饰的参数,方法可以返回对应参数的值   作用 先看一个例子 定义变量:   ...

  2. ubuntu访问win10下的磁盘

    在ubuntu下访问win10的磁盘时,提示出错. 先用命令查看一下磁盘挂载情况. sudo fdisk -l 会看到一些信息 我要访问的是E盘,也就是 /dev/sda6 这个分区 使用命令ntfx ...

  3. 转:linux关闭防火墙iptables

    ref:https://jingyan.baidu.com/article/066074d64f433ec3c21cb000.html Linux系统下面自带了防火墙iptables,iptables ...

  4. LCA:倍增与tarjan

    学了好久(一两个星期)都没彻底搞懂的lca,今天总算理解了.就来和大家分享下我自己的心得 首先,如果你还不懂什么是lca,出门左转自行百度 首先讲倍增 倍增的思想很简单,首先进行预处理,用一个深搜将每 ...

  5. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

  6. Eclipse中Tomcat 修改后台代码即时生效

    修改类后不用重启Tomcat就能自动生效,对于提高开发效率的帮助很大. server.xml 中节点定义时一般会有如下配置: <Context docBase="test1" ...

  7. springMVC

    SpringMVC架构流程: 1.用户发送请求至前端控制器DispatcherServlet2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.3.处理器映射器 ...

  8. JSP与Servlet传值及对比

    JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达. JSP编译后是”类servlet”. Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在 ...

  9. javascript的优缺点和内置对象

    1)优点:简单易用,与Java有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标: ...

  10. 深入理解javascript函数系列第一篇

    前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...