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打造 ...
随机推荐
- phpmailer发送邮件出现错误:stream_socket_enable_crypto(): SSL operation failed with code 1.
如果开了调试,调试进去会看到错误提示: smtp_code:"stream_socket_enable_crypto(): SSL operation failed with code 1. ...
- ASP.NET WebAPI 02-Action的选择(一)
在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步. Http方法匹配 WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptV ...
- 什么是APS高级计划排程(生产计划排产)系统主要功能模块有哪些?
什么是APS高级计划排程(生产计划排产)系统? APS高级计划排程(高级计划排产)系统主要解决“在有限产能条件下,交期产能精确预测.工序生产与物料供应最优详细计划”的问题.APS高级计划排程(高级计划 ...
- TestDirector自定义管理:工程配置
一.工程配置 1.进入工程配置界面 2.点击“customize project entities”弹出自定义字段对话框.(这里有六个表,每个表中的字段分为系统字段(system fields)和用户 ...
- 【JavaWeb开发】初步实现网站应用钉钉扫码登录
http://blog.csdn.net/baofeidyz/article/details/59059379 版权声明:转载请注明我的个人微信平台 暴沸 目录(?)[+] 写在前面:如果你还不知道钉 ...
- Windows 如何远程登陆 Server 的 jupyter
jupyter 安装就不用赘述了,本示例以 Putty 为例,展示如何从本地 windows 系统调用远程的 jupyter notebook 并且在本地 Chrome 中打开的方法 1. 首先,ss ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)J - Piglet treasure hunt Series 2
题目描述 Once there was a pig, which was very fond of treasure hunting. One day, when it woke up, it fou ...
- 浅谈MVVM模式和MVP模式——Vue.js向
浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...
- Netstat -tln 命令是Linux查看端口使用情况
Netstat -tln 命令是Linux查看端口使用情况
- FFTW3学习笔记3:FFTW 和 CUFFT 的使用对比
一.流程 1.使用cufftHandle创建句柄 2.使用cufftPlan1d(),cufftPlan3d(),cufftPlan3d(),cufftPlanMany()对句柄进行配置,主要是配置句 ...