📄 v4l_lin.c
字号:
/******************************林启俊_V4L_采集**************************************************** ****作者: 林启俊 * ****日期: 2006-11-30 * **** * **** * ALL RIGHTS Reserved **** ***版本: 1.0 * ****环境: Linux * **** ****目的: 为3G手机的现场直播而准备 ***申明: 一切解释权本人作解释;不得修改(除非经本人同意),不得发表!****** e_mail: linqijun211@163.com**********************************************************************************************人生格言: 为人生理想而战斗,不怕辛苦!! 为报答父母而奋斗,不怕劳累!! ******************************************************************************************************************说明: 此程序尽力让V4L简单而写,采用调用函数来实现;希望对学习V4L的朋友有所帮助 ************ 我的摄像头只支持两贞采集,我的想法是,每采集一贞就保存了一个图像;所以我设了两个图像文件 ************* /home/linzi.jpeg和/home/linzicheng.jpeg;用的时候可以随便保存到任何地方的 ************************* Please email to me if you have some problems or advices to me to modify! than you !! ***********/ #include "v4l_linqijun.h" int lin_get_open(char *p) { if( (fd=open(p,O_RDWR,0666))<0) return -1; else return 0; } int lin_get_capability(int fd, cap* capability) { if ( ioctl(fd ,VIDIOCGCAP, capability)<0) return -1; else return 0;}int lin_get_picture(int fd, pic* pic){ if(ioctl(fd,VIDIOCGPICT,pic)<0) return -1; else return 0;}int lin_set_picture(int fd,pic* pic) { pic->colour=50000; //没有颜色,黑白的; pic->hue=0; //灰度为0; // pic->whiteness=65535; // pic->contrast=2000; if(ioctl(fd,VIDIOCSPICT,pic)<0) return -1; else return 0;}int lin_set_window(int fd, win* win){ win->x =0;
win->y =0 ;
win->width = 320;
win->height =240;
if(ioctl(fd,VIDIOCSWIN, win)==-1) return -1; else return 0;}int lin_get_mbuf(int fd,mb *mbuf){ if(ioctl(fd,VIDIOCGMBUF,mbuf)<0) return -1; else return 0;} int lin_set_mmap(mm* mmap) { mmap->width=window.width; mmap->height=window.height; mmap->format =picture.palette; mmap->frame=0; return 0;} int lin_memory_map(int fd,int size) { map=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(map==MAP_FAILED) return -1; else { printf("map address is %p\n",map); return 0; }}int lin_start_capture(int fd, mm* mmap){ int j=0; int frame=0; if(ioctl(fd,VIDIOCMCAPTURE,mmap)<0) //这一定要是mmap,它就是地址了;呵呵 { perror("\t\n DIOCMCAPTURE\n"); return -1; }else printf("\t\nCAPTURE SUCCESS \n"); while(j<mbuf.frames) { if (ioctl(fd, VIDIOCSYNC, &frame) < 0) { perror("\t v4l_grab_sync\n"); return -1;} else printf(" \t SYNC success!\n"); frame=(frame+1)%2; mmap->frame=frame; if(ioctl(fd,VIDIOCMCAPTURE,mmap)<0) {perror(" \t\nVIDIOCMCAPTURE\n"); return -1;} else printf("\t\n next frame capture sucess\n"); j++;}return 0;} char* lin_get_mapaddress(int frame) { char *frameaddress=""; frameaddress=map+mbuf.offsets[frame]; if(frameaddress>0) { printf("frameadress is %p\n",frameaddress); return frameaddress; } else return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -