H.264远程视频监控系统
- 由usb摄像头驱动,h264编码库,采集read_video,传输,客户端显示组成
- 读取摄像头数据缓冲区是否有帧数据收到,有数据收到就读取数据并进行H264编码,把数据发送到socket发送到客户端。
- 配置内核:make menuconfig ARCH=arm, 选择gerneral setup-->multimedia devices-->device drivers-->multimedia devices-->video capture adapters-->V4L USB devices-->USB OV511 camera support
- 编译内核:make uImage ARCH=arm
- CROSS_COMPILE=arm-linux-
- 将uImage拷贝到tftpboot目录下
- 编译t264
- 编译server_arm
- 挂载文件系统
- 连接usb摄像头, 节点自动创建起来,ls -l /dev/video0, mknod /dev/video0 c
- 在ARM上运行视频采集和发送程序./server_arm fastspeed.txt
- 在PC端打开客户端LinuxClient.exe, 看到视频信息。
- 主要程序充server_arm.c
- /* 服务端程序 server.c */
- //WB
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <sys/ioctl.h>
- #include <sys/mman.h>
- #include <stdlib.h>
- #include <linux/types.h>
- #include <linux/videodev.h>
- #include <setjmp.h>
- #include <string.h>
- #include <signal.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include "convert.h"
- #include "../avc-src-0.14/avc/common/T264.h"
- #define SERVER_PORT 8888
- T264_t* m_t264;
- T264_param_t m_param;
- char* m_pSrc;
- char* m_pDst;
- int* m_lDstSize;
- char* m_pPoolData;
- #define USB_VIDEO "/dev/video0"
- int cam_fd;
- struct video_mmap cam_mm;/*视频内存映射*/
- /*包含摄像头的基本信息,例如设备名称、
- 支持的最大最小分辨率、信号源信息等*/
- struct video_capability cam_cap;
- /*亮度、对比度等和voide_mmap中的分辨率*/
- struct video_picture cam_pic;
- struct video_mbuf cam_mbuf;/*摄像头存储缓冲区的帧信息*/
- struct video_window win;/* 设备采集窗口参数*/
- char *cam_data = NULL;
- int nframe;
- void read_video(char *pixels,int w, int h)
- {
- int ret;
- ;
- cam_mm.width = w;
- cam_mm.height = h;
- /* 对于单帧采集只需设置 frame=0*/
- cam_mm.frame = ;
- cam_mm.format=VIDEO_PALETTE_YUV420P; //change by 091215
- /* 若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的*/
- ret = ioctl(cam_fd,VIDIOCMCAPTURE,&cam_mm);
- ) {
- printf("ERROR: VIDIOCMCAPTURE\n");
- }
- /* 函数判断该帧图像是否截取完毕,成功返回表示截取完毕*/
- ret = ioctl(cam_fd,VIDIOCSYNC,&frame);
- ) {
- printf("ERROR: VIDIOCSYNC\n");
- }
- }
- void config_vid_pic()
- {
- ];
- FILE *cf;
- int ret;
- ) {
- printf("ERROR:VIDIOCGPICT\n");
- }
- /*图像采集格式,网眼V2000只支持VIDEO_PALETTE_YUV420P*/
- cam_pic.palette = VIDEO_PALETTE_YUV420P; //change by 091215
- #if 0
- cam_pic.brightness = ;
- cam_pic.hue = ;
- cam_pic.colour = ;
- cam_pic.contrast = ;
- cam_pic.whiteness = ;
- cam_pic.depth = ;
- #endif
- cam_pic.brightness = ;
- cam_pic.hue = ;
- cam_pic.colour = ;
- cam_pic.contrast = ;
- cam_pic.whiteness = ;
- /*VIDEO_PALETTE_YUV420,bpp=12bit*/
- cam_pic.depth = ; //bpp == bytes per pixel,change by 091215
- /*设置摄像头缓冲中voideo_picture信息*/
- ret = ioctl( cam_fd, VIDIOCSPICT,&cam_pic );
- ) {
- close(cam_fd);
- printf("ERROR: VIDIOCSPICT,Can't set video_picture format\n");
- }
- return;
- }
- void init_video(int w,int h) /* bpp == bytes per pixel*/
- {
- int ret;
- /*设备的打开*/
- cam_fd = open( USB_VIDEO, O_RDWR );
- )
- printf("Can't open video device\n");
- /* 使用IOCTL命令VIDIOCGCAP,获取摄像头的基本信息,如最大,最小分辨率*/
- ret = ioctl( cam_fd,VIDIOCGCAP,&cam_cap ); /* 摄像头的基本信息*/
- ) {
- printf("Can't get device information: VIDIOCGCAP\n");
- }
- 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);
- ) {
- printf("ERROR:VIDIOCGWIN\n");
- }
- win.x = ; //windows中的原点坐标
- win.y = ; //windows中的原点坐标
- win.width=w; //capture area 宽度
- win.height=h; //capture area 高度
- /*使用IOCTL命令VIDIOCSWIN,设置摄像头的基本信息*/
- ) {
- printf("ERROR:VIDIOCSWIN\n");
- }
- /*设置摄像头voideo_picture信息*/
- config_vid_pic();
- /*使用IOCTL命令VIDIOCGCAP,获取获得摄像头存储缓冲区的帧信息*/
- ret = ioctl(cam_fd,VIDIOCGMBUF,&cam_mbuf);
- ) {
- printf("ERROR:VIDIOCGMBUF,Can't get video_mbuf\n");
- }
- printf("Frames:%d\n",cam_mbuf.frames);
- nframe = cam_mbuf.frames;
- /*接着把摄像头对应的设备文件映射到内存区*/
- cam_data = (, cam_mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED,cam_fd,);
- if( cam_data == MAP_FAILED ) {
- printf("ERROR:mmap\n");
- }
- printf(]);
- InitLookupTable();
- }
- void init_param(T264_param_t* param, const char* file)
- {
- int total_no;
- FILE* fd;
- ];
- int32_t b;
- if (!(fd = fopen(file,"r")))
- {
- printf("Couldn't open parameter file %s.\n", file);
- exit(-);
- }
- memset(param, , sizeof(*param));
- fgets(line, , fd); sscanf(line,"%d", &b);
- )
- {
- printf("wrong param file version, expect v4.0\n");
- exit(-);
- }
- fgets(line, , fd); sscanf(line,"%d", ¶m->width);
- fgets(line, , fd); sscanf(line,"%d", ¶m->height);
- fgets(line, , fd); sscanf(line,"%d", ¶m->search_x);
- fgets(line, , fd); sscanf(line,"%d", ¶m->search_y);
- fgets(line, , fd); sscanf(line,"%d", &total_no);
- fgets(line, , fd); sscanf(line,"%d", ¶m->iframe);
- fgets(line, , fd); sscanf(line,"%d", ¶m->idrframe);
- fgets(line, , fd); sscanf(line,"%d", ¶m->b_num);
- fgets(line, , fd); sscanf(line,"%d", ¶m->ref_num);
- fgets(line, , fd); sscanf(line,"%d", ¶m->enable_rc);
- fgets(line, , fd); sscanf(line,"%d", ¶m->bitrate);
- fgets(line, , fd); sscanf(line,"%f", ¶m->framerate);
- fgets(line, , fd); sscanf(line,"%d", ¶m->qp);
- fgets(line, , fd); sscanf(line,"%d", ¶m->min_qp);
- fgets(line, , fd); sscanf(line,"%d", ¶m->max_qp);
- fgets(line, , fd); sscanf(line,"%d", ¶m->enable_stat);
- fgets(line, , fd); sscanf(line,"%d", ¶m->disable_filter);
- fgets(line, , fd); sscanf(line,"%d", ¶m->aspect_ratio);
- fgets(line, , fd); sscanf(line,"%d", ¶m->video_format);
- fgets(line, , fd); sscanf(line,"%d", ¶m->luma_coeff_cost);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_INTRA16x16) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_INTRA4x4) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_INTRAININTER) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_HALFPEL) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_QUARTPEL) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_SUBBLOCK) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_FULLSEARCH) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_DIAMONDSEACH) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_FORCEBLOCKSIZE) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_FASTINTERPOLATE) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_SAD) * b;
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_EXTRASUBPELSEARCH) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->flags |= (USE_SCENEDETECT) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_16x16P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_16x8P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_8x16P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_8x8P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_8x4P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_4x8P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_4x4P) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_16x16B) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_16x8B) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_8x16B) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", &b);
- param->block_size |= (SEARCH_8x8B) * (!!b);
- fgets(line, , fd); sscanf(line,"%d", ¶m->cpu);
- fgets(line, , fd); sscanf(line, "%d", ¶m->cabac);
- // fgets(line, 254, fd); sscanf(line,"%s", src_path);
- // fgets(line, 254, fd); sscanf(line,"%s", out_path);
- // fgets(line, 254, fd); sscanf(line,"%s", rec_path);
- // param->rec_name = rec_path;
- fclose(fd);
- }
- void init_encoder()
- {
- //编码准备
- const char* paramfile = "fastspeed.txt";
- /*获取fastspeed.txt文件信息*/
- init_param(&m_param, paramfile);
- m_param.direct_flag = ;
- /*t264编码的打开*/
- m_t264 = T264_open(&m_param);
- m_lDstSize = m_param.height * m_param.width + (m_param.height * m_param.width >> );
- /*分配t264解码后数据存放的内存*/
- m_pDst = (uint8_t*)T264_malloc(m_lDstSize, CACHE_SIZE);
- /*分配内存用于存放一帧数据长度的数据*/
- m_pPoolData = malloc(m_param.width*m_param.height*/);
- }
- void udps_respon(int sockfd,int w,int h)
- {
- struct sockaddr_in addrsrc;
- struct sockaddr_in addrdst;
- int addrlen,n;
- int32_t iActualLen;
- *h/;
- bzero(&addrdst,sizeof(struct sockaddr_in));
- addrdst.sin_family=AF_INET;
- /*客户端PC机IP地址*/
- addrdst.sin_addr.s_addr=inet_addr("172.18.23.26");
- addrdst.sin_port=htons(SERVER_PORT);
- )
- {
- /*数据的采集*/
- read_video(NULL,w,h);
- /*对采集到的数据通过H264编码*/
- iActualLen = T264_encode(m_t264, cam_data, m_pDst, row_stride);
- printf("encoded:%d, %d bytes.\n",row_stride,iActualLen);
- /*frame_num:存放帧号*/
- memcpy(m_pPoolData,&m_t264->frame_num,);
- /*m_pDst解码后的数据*/
- memcpy(m_pPoolData+, m_pDst, iActualLen);
- iActualLen++;
- /*使用UDP协议发送编码后的数据到客服端*/
- sendto(sockfd,m_pPoolData,iActualLen,,(struct sockaddr*)&addrdst,sizeof(struct sockaddr_in));
- }
- }
- void free_dev()
- {
- printf("free device\n");
- close(cam_fd);
- }
- /*主函数入口*/
- int main(void)
- {
- int sockfd;
- struct sockaddr_in addr;
- printf("start 2.0...\n");
- /*创建套接字*/
- sockfd=socket(AF_INET,SOCK_DGRAM,);
- )
- {
- printf("0-");
- printf("Socket Error\n");
- exit();
- }
- bzero(&addr,sizeof(struct sockaddr_in));
- addr.sin_family=AF_INET;
- addr.sin_addr.s_addr=htonl(INADDR_ANY);
- addr.sin_port=htons(SERVER_PORT);
- /*套接字绑定*/
- )
- {
- printf(stderr,"Bind Error:%s\n",strerror(errno));
- exit();
- }
- /*该函数完成编码前的准备*/
- init_encoder();
- atexit( &free_dev );
- /*采集数据前的初始化函数*/
- init_video(m_param.width,m_param.height);
- /*使用UDP协议发送采集到的数据*/
- udps_respon(sockfd,m_param.width,m_param.height);
- close(sockfd);
- }
H.264远程视频监控系统的更多相关文章
- 如何利用SimpleNVR建立全天候远程视频监控系统
随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...
- 基于Android的远程视频监控系统(含源码)
基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...
- 嵌入式应用开发第四阶段-基于rk3399的视频监控系统
一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...
- Python远程视频监控
Python远程视频监控程序 老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...
- VSAM:视频监控系统 A System for Video Surveillance and Monitoring
VSAM(VideoSurveillance and Monitoring)视频监控系统 Robotics Institute CMU 1:引言 2:试验床介绍 3:基本的视频分析算法:运动目标检测, ...
- Qt编写安防视频监控系统9-自动隐藏光标
一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...
- Qt编写安防视频监控系统5-视频回放
一.前言 一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK来做兼容处理,烦得很,厂家越来 ...
- 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾 ...
- 基于.NET打造IP智能网络视频监控系统
开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献:基于.NET打造 ...
随机推荐
- out与ref修饰符
out修饰符 定义 作用 使用注意 总结 定义 out意为output,所以被out修饰的参数叫做输出参数. 通过使用out修饰的参数,方法可以返回对应参数的值 作用 先看一个例子 定义变量: ...
- ubuntu访问win10下的磁盘
在ubuntu下访问win10的磁盘时,提示出错. 先用命令查看一下磁盘挂载情况. sudo fdisk -l 会看到一些信息 我要访问的是E盘,也就是 /dev/sda6 这个分区 使用命令ntfx ...
- 转:linux关闭防火墙iptables
ref:https://jingyan.baidu.com/article/066074d64f433ec3c21cb000.html Linux系统下面自带了防火墙iptables,iptables ...
- LCA:倍增与tarjan
学了好久(一两个星期)都没彻底搞懂的lca,今天总算理解了.就来和大家分享下我自己的心得 首先,如果你还不懂什么是lca,出门左转自行百度 首先讲倍增 倍增的思想很简单,首先进行预处理,用一个深搜将每 ...
- Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器
目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...
- Eclipse中Tomcat 修改后台代码即时生效
修改类后不用重启Tomcat就能自动生效,对于提高开发效率的帮助很大. server.xml 中节点定义时一般会有如下配置: <Context docBase="test1" ...
- springMVC
SpringMVC架构流程: 1.用户发送请求至前端控制器DispatcherServlet2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.3.处理器映射器 ...
- JSP与Servlet传值及对比
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达. JSP编译后是”类servlet”. Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在 ...
- javascript的优缺点和内置对象
1)优点:简单易用,与Java有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标: ...
- 深入理解javascript函数系列第一篇
前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...