?? 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 + -