H.264远程视频监控实验报告.docx_第1页
H.264远程视频监控实验报告.docx_第2页
H.264远程视频监控实验报告.docx_第3页
H.264远程视频监控实验报告.docx_第4页
H.264远程视频监控实验报告.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郑州轻工业学院实验报告H.264远程视频监控实验 专业班级:嵌入式软件专业11-02班姓名:学号:541113430联系方式:H.264远程视频监控实验报告一项目准备:1. 硬件准备:mini2440开发板一套;USB摄像头一套。2. 软件准备:移植Linux2.6.29内核,使其可运行于mini2440开发板;开发USB host controller驱动。二项目需求:1. 产品构架图:2. 产品功能演示:三系统设计:1. 项目设计根据项目需求分析,该项目主要涉及3部分的软件开发工作:1. USB摄像头驱动移植;2. H.264编码库移植;3. 视频采集传输应用程序开发。2. 视频采集应用程序流程图四项目开发:1. USB摄像头驱动程序移植内核里自带摄像头驱动,手动即可:1. 创建项目目录#mkdir/home/project/h246#cd/home/project/h2462. 通过SMB服务将SDK-H264/server目录拷贝到项目目录下3. 解压内核到当前目录#cd/home/project/h264/server/kernel#tar zxvf Linux.2.6.29.tar.gz4. 清理中间文件、配置文件#cd Linux-2.6.29#make distclean5. 选择参考配置文件#cp config-h264.config6. 配置内核.1内核的配置#make menuconfig ARCH=armCROSS_COMPILE=arm-Linux-.2要使内核支持USB摄像头驱动,内核必须选上如下的配置选项:Device drivers-multimedia devices-选择 【*】video capture adaptersDevice drivers-multimedia devices-Video capture adapters-V4L USB device-选择 USB Ov511 Camera Support.3退出、保存7. 编译内核#make ulmage ARCH=armCROSS_COMPILE=arm-linux-8. 将ulmage拷贝到tftp服务项目/tftpbot#cp arch/arm/boot/ulmage/tftpboot/ulmage-h2642. H.264编码库移植步骤:#cd /home/project/h264/server/h264#cd avc-src-0.14/avc/build/linux#make#rm rf avc-src-0.14/avc/build/obj/T264.O3. 传输程序开发传输应用程序位于SDK-H264/server/app中。步骤如下:#cd/home/project/h264/server/h264#cd app#vim sever_arm.c#make五项目测试:.1拷贝server_arm和fastspeed.txt到根文件系统.2在pc机和mini2440开发板之间连接好电源、串口、网线.3采用NFS方式起根文件系统.4连接USB摄像头.5运行视频采集应用程序六项目代码:/* 服务端程序 server.c */ /WB#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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/video0int 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; int frame=0; cam_mm.width = w; cam_mm.height = h; /* 对于单帧采集只需设置 frame=0*/ cam_mm.frame = 0; cam_mm.format=VIDEO_PALETTE_YUV420P; /change by 091215/* 若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的*/ ret = ioctl(cam_fd,VIDIOCMCAPTURE,&cam_mm); if( ret0 ) printf(ERROR: VIDIOCMCAPTUREn); /* 函数判断该帧图像是否截取完毕,成功返回表示截取完毕*/ ret = ioctl(cam_fd,VIDIOCSYNC,&frame); if( ret0 ) printf(ERROR: VIDIOCSYNCn); void config_vid_pic() char cfpath100; FILE *cf; int ret; if (ioctl(cam_fd, VIDIOCGPICT, &cam_pic) 0) printf(ERROR:VIDIOCGPICTn); /*图像采集格式,网眼V2000只支持VIDEO_PALETTE_YUV420P*/ cam_pic.palette = VIDEO_PALETTE_YUV420P; /change by 091215#if 0 cam_pic.brightness = 30464; cam_pic.hue = 36000; cam_pic.colour = 0; cam_pic.contrast = 43312; cam_pic.whiteness = 10312; cam_pic.depth = 24;#endif cam_pic.brightness =30464; cam_pic.hue =111; cam_pic.colour =555; cam_pic.contrast =43312; cam_pic.whiteness =111; /*VIDEO_PALETTE_YUV420,bpp=12bit*/ cam_pic.depth = 12; /bpp = bytes per pixel,change by 091215 /*设置摄像头缓冲中voideo_picture信息*/ ret = ioctl( cam_fd, VIDIOCSPICT,&cam_pic ); if( ret0 ) close(cam_fd); printf(ERROR: VIDIOCSPICT,Cant set video_picture formatn); return;void init_video(int w,int h) /* bpp = bytes per pixel*/ int ret; /*设备的打开*/ cam_fd = open( USB_VIDEO, O_RDWR ); if( cam_fd0 ) printf(Cant open video devicen);/* 使用IOCTL命令VIDIOCGCAP,获取摄像头的基本信息,如最大,最小分辨率*/ ret = ioctl( cam_fd,VIDIOCGCAP,&cam_cap ); /* 摄像头的基本信息*/ if( ret0 ) printf(Cant get device information: VIDIOCGCAPn); printf(Device name:%snWidth:%d %dnHeight:%d %dn,cam_, cam_cap.maxwidth, cam_cap.minwidth, cam_cap.maxheight, cam_cap.minheight); if( ioctl(cam_fd,VIDIOCGWIN,&win)0 ) printf(ERROR:VIDIOCGWINn); win.x = 0; /windows中的原点坐标 win.y = 0; /windows中的原点坐标 win.width=w; /capture area 宽度 win.height=h; /capture area 高度 /*使用IOCTL命令VIDIOCSWIN,设置摄像头的基本信息*/ if (ioctl(cam_fd, VIDIOCSWIN, &win) 0) printf(ERROR:VIDIOCSWINn); /*设置摄像头voideo_picture信息*/ config_vid_pic(); /*使用IOCTL命令VIDIOCGCAP,获取获得摄像头存储缓冲区的帧信息*/ ret = ioctl(cam_fd,VIDIOCGMBUF,&cam_mbuf); if( retwidth);fgets(line, 254, fd); sscanf(line,%d, ¶m-height);fgets(line, 254, fd); sscanf(line,%d, ¶m-search_x);fgets(line, 254, fd); sscanf(line,%d, ¶m-search_y);fgets(line, 254, fd); sscanf(line,%d, &total_no);fgets(line, 254, fd); sscanf(line,%d, ¶m-iframe);fgets(line, 254, fd); sscanf(line,%d, ¶m-idrframe);fgets(line, 254, fd); sscanf(line,%d, ¶m-b_num);fgets(line, 254, fd); sscanf(line,%d, ¶m-ref_num);fgets(line, 254, fd); sscanf(line,%d, ¶m-enable_rc);fgets(line, 254, fd); sscanf(line,%d, ¶m-bitrate);fgets(line, 254, fd); sscanf(line,%f, ¶m-framerate);fgets(line, 254, fd); sscanf(line,%d, ¶m-qp);fgets(line, 254, fd); sscanf(line,%d, ¶m-min_qp);fgets(line, 254, fd); sscanf(line,%d, ¶m-max_qp);fgets(line, 254, fd); sscanf(line,%d, ¶m-enable_stat);fgets(line, 254, fd); sscanf(line,%d, ¶m-disable_filter);fgets(line, 254, fd); sscanf(line,%d, ¶m-aspect_ratio);fgets(line, 254, fd); sscanf(line,%d, ¶m-video_format);fgets(line, 254, fd); sscanf(line,%d, ¶m-luma_coeff_cost);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_INTRA16x16) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_INTRA4x4) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_INTRAININTER) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_HALFPEL) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_QUARTPEL) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_SUBBLOCK) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_FULLSEARCH) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_DIAMONDSEACH) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_FORCEBLOCKSIZE) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_FASTINTERPOLATE) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_SAD) * b;fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_EXTRASUBPELSEARCH) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-flags |= (USE_SCENEDETECT) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_16x16P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_16x8P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_8x16P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_8x8P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_8x4P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_4x8P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_4x4P) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_16x16B) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_16x8B) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_8x16B) * (!b);fgets(line, 254, fd); sscanf(line,%d, &b);param-block_size |= (SEARCH_8x8B) * (!b);fgets(line, 254, fd); sscanf(line,%d, ¶m-cpu);fgets(line, 254, 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 = 1;/*t264编码的打开*/m_t264 = T264_open(&m_param);m_lDstSize = m_param.height * m_param.width + (m_param.height * m_param.width 1); /*分配t264解码后数据存放的内存*/m_pDst = (uint8_t*)T264_malloc(m_lDstSize, CACHE_SIZE);/*分配内存用于存放一帧数据长度的数据*/m_pPoolData = malloc(m_param.width*m_param.height*3/2); void udps_respon(int sockfd,int w,int h) struct sockaddr_in addrsrc;struct sockaddr_in addrdst; int addrlen,n; int32_t iActualLen;int row_stride = w*3*h/2;bzero(&addrdst,sizeof(struct sockaddr_in); addrdst.sin_family=AF_INET; /*客户端PC机IP地址*/addrdst.sin_addr.s_addr=inet_addr(6);addrdst.sin_port=htons(SERVER_PORT);while(1) /*数据的采集*/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,1);/*m_pDst解码后的数据*/memcpy(m_pPoolData+1, m_pDst, iActualLen);iActualLen+;/*使用UDP协议发送编码后的数据到客服端*/sendto(so

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论