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打造 ...
随机推荐
- 【转】EventBus 3.0使用详解
原文:https://www.jianshu.com/p/f9ae5691e1bb 01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数 ...
- [实战]MVC5+EF6+MySql企业网盘实战(7)——文件上传
写在前面 周末了,在家继续折腾网盘,今天实现网盘文件的上传. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战] ...
- 转:深入剖析 JavaScriptCore
ref:https://ming1016.github.io/2018/04/21/deeply-analyse-javascriptcore/ 深入剖析 JavaScriptCore
- 转:Ubuntu16.04下配置php+vscode+xdebug开发环境
转:https://blog.csdn.net/its_my_dream/article/details/78549619 操作系统是Ubuntu16.04,首先要安装和配置php运行环境,我这里用的 ...
- 使用afl-dyninst fuzz无源码的二进制程序
转:http://ele7enxxh.com/Use-AFL-dyninst-To-Fuzz-Blackbox-Binaries.html 使用afl-dyninst fuzz无源码的二进制程序 通常 ...
- viewpager切换耗时控制
原文地址https://my.oschina.net/javalover/blog/179003 public class FixedSpeedScroller extends Scroller { ...
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- Bzoj[Usaco2018 Feb]5194 Snow Boots(线段树)
Description 到冬天了,这意味着下雪了!从农舍到牛棚的路上有N块地砖,方便起见编号为1…N,第i块地砖上积了fi英尺的雪 .在Farmer John的农舍的地窖中,总共有B双靴子,编号为1… ...
- Bzoj5188/洛谷P4185 [Usaco2018 Jan]MooTube(并查集)
题面 Bzoj 洛谷 题解 最暴力的方法是直接判两个点之间的路径最小值是否\(\geq k\),用\(Dijkstra\)可以做到该算法最快效率,但是空间复杂度始终是\(O(n^2)\)的,会\(ML ...
- Codechef SEP14 QRECT cdq分治+线段树
题意 支持删除矩阵.插入矩阵.查询当前矩阵与之前有多少个矩阵相交 算相交的时候容斥一下:相交矩形数 = 总矩形数-X轴投影不相交的矩形数-Y轴投影不相交的矩形数-XY轴投影下都不相交的矩形数 最后一项 ...